@vkontakte/videoplayer-core 2.0.132-dev.a4a5e7bd.0 → 2.0.132-dev.bc968375.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/evergreen.esm.js CHANGED
@@ -1,9 +1,9 @@
1
1
  /**
2
- * @vkontakte/videoplayer-core v2.0.132-dev.a4a5e7bd.0
3
- * Wed, 21 May 2025 09:48:01 GMT
2
+ * @vkontakte/videoplayer-core v2.0.132-dev.bc968375.0
3
+ * Tue, 03 Jun 2025 05:58:20 GMT
4
4
  * https://st.mycdn.me/static/vkontakte-videoplayer/2-0-132/doc/
5
5
  */
6
- var Fo="2.0.132-dev.a4a5e7bd.0";var Ue=(r=>(r.STOPPED="stopped",r.READY="ready",r.PLAYING="playing",r.PAUSED="paused",r))(Ue||{}),kt=(v=>(v.MPEG="MPEG",v.DASH="DASH",v.DASH_SEP="DASH_SEP",v.DASH_SEP_VK="DASH_SEP",v.DASH_WEBM="DASH_WEBM",v.DASH_WEBM_AV1="DASH_WEBM_AV1",v.DASH_STREAMS="DASH_STREAMS",v.DASH_WEBM_VK="DASH_WEBM",v.DASH_ONDEMAND="DASH_ONDEMAND",v.DASH_ONDEMAND_VK="DASH_ONDEMAND",v.DASH_LIVE="DASH_LIVE",v.DASH_LIVE_CMAF="DASH_LIVE_CMAF",v.DASH_LIVE_WEBM="DASH_LIVE_WEBM",v.HLS="HLS",v.HLS_ONDEMAND="HLS_ONDEMAND",v.HLS_JS="HLS",v.HLS_LIVE="HLS_LIVE",v.HLS_LIVE_CMAF="HLS_LIVE_CMAF",v.WEB_RTC_LIVE="WEB_RTC_LIVE",v))(kt||{});var $s=(r=>(r.NOT_AVAILABLE="NOT_AVAILABLE",r.AVAILABLE="AVAILABLE",r.CONNECTING="CONNECTING",r.CONNECTED="CONNECTED",r))($s||{}),nn=(i=>(i.HTTP1="http1",i.HTTP2="http2",i.QUIC="quic",i))(nn||{});var on=(a=>(a.NONE="none",a.INLINE="inline",a.FULLSCREEN="fullscreen",a.SECOND_SCREEN="second_screen",a.PIP="pip",a.INVISIBLE="invisible",a))(on||{}),Bs=(i=>(i.TRAFFIC_SAVING="traffic_saving",i.HIGH_QUALITY="high_quality",i.UNKNOWN="unknown",i))(Bs||{});import{assertNever as zo,assertNonNullable as Yc,isNonNullable as Rs,ValueSubject as un,Subject as Kc,Subscription as Xc,merge as Jc,observableFrom as Zc,fromEvent as _o,map as Uo,tap as Ho,filterChanged as ed,isNullable as ln,ErrorCategory as jo}from"@vkontakte/videoplayer-shared/evergreen";var No=n=>new Promise((e,t)=>{let i=document.createElement("script");i.setAttribute("src",n),i.onload=()=>e(),i.onerror=r=>t(r),document.body.appendChild(i)});var Ds=class{constructor(e){this.connection$=new un(void 0);this.castState$=new un("NOT_AVAILABLE");this.errorEvent$=new Kc;this.realCastState$=new un("NOT_AVAILABLE");this.subscription=new Xc;this.isDestroyed=!1;this.params=e,this.log=this.params.dependencies.logger.createComponentLog("ChromecastInitializer");let t="chrome"in window;if(this.log({message:`[constructor] receiverApplicationId: ${this.params.receiverApplicationId}, isDisabled: ${this.params.isDisabled}, isSupported: ${t}`}),e.isDisabled||!t)return;let i=Rs(window.chrome?.cast),r=!!window.__onGCastApiAvailable;i?this.initializeCastApi():(window.__onGCastApiAvailable=s=>{delete window.__onGCastApiAvailable,s&&!this.isDestroyed&&this.initializeCastApi()},r||No("https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1").catch(()=>this.errorEvent$.next({id:"ChromecastLoading",category:jo.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(){Rs(this.connection$.getValue())?this.disconnect():this.connect()}setVolume(e){let t=this.connection$.getValue();ln(t)||(t.remotePlayer.volumeLevel=e,t.remotePlayerController.setVolumeLevel())}setMuted(e){let t=this.connection$.getValue();ln(t)||e!==t.remotePlayer.isMuted&&t.remotePlayerController.muteOrUnmute()}destroy(){this.isDestroyed=!0,this.subscription.unsubscribe()}initListeners(){let e=new cast.framework.RemotePlayer,t=new cast.framework.RemotePlayerController(e),i=cast.framework.CastContext.getInstance();this.subscription.add(_o(i,cast.framework.CastContextEventType.SESSION_STATE_CHANGED).subscribe(r=>{switch(r.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 zo(r.sessionState)}})).add(Jc(_o(i,cast.framework.CastContextEventType.CAST_STATE_CHANGED).pipe(Ho(r=>{this.log({message:`[cast.framework.RemotePlayerEventType.CAST_STATE_CHANGED]: ${JSON.stringify(r)}`})}),Uo(r=>r.castState)),Zc([i.getCastState()])).pipe(ed(),Uo(td),Ho(r=>{this.log({message:`realCastState$: ${r}`})})).subscribe(this.realCastState$)).add(this.realCastState$.subscribe(r=>{let s=r==="CONNECTED",a=Rs(this.connection$.getValue());if(s&&!a){let o=i.getCurrentSession();Yc(o);let u=o.getCastDevice(),l=o.getMediaSession()?.media?.contentId;(ln(l)||l===this.contentId)&&(this.log({message:"connection created"}),this.connection$.next({remotePlayer:e,remotePlayerController:t,session:o,castDevice:u}))}else!s&&a&&(this.log({message:"connection destroyed"}),this.connection$.next(void 0));this.castState$.next(r==="CONNECTED"?Rs(this.connection$.getValue())?"CONNECTED":"AVAILABLE":r)}))}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(r){this.errorEvent$.next({id:"ChromecastInitializer",category:jo.EXTERNAL_API,message:"[initializeCastApi] failed",thrown:r})}}},td=n=>{switch(n){case cast.framework.CastState.NO_DEVICES_AVAILABLE:return"NOT_AVAILABLE";case cast.framework.CastState.NOT_CONNECTED:return"AVAILABLE";case cast.framework.CastState.CONNECTING:return"CONNECTING";case cast.framework.CastState.CONNECTED:return"CONNECTED";default:return zo(n)}};import{assertNever as Qo}from"@vkontakte/videoplayer-shared/evergreen";var pe=(n,e=0,t=0)=>{switch(t){case 0:return n.replace("_offset_p",e===0?"":"_"+e.toFixed(0));case 1:{if(e===0)return n;let i=new URL(n);return i.searchParams.append("playback_shift",e.toFixed(0)),i.toString()}case 2:{let i=new URL(n);return!i.searchParams.get("offset_p")&&e===0?n:(i.searchParams.set("offset_p",e.toFixed(0)),i.toString())}default:Qo(t)}return n},Nt=(n,e)=>{switch(e){case 0:return NaN;case 1:{let t=new URL(n);return Number(t.searchParams.get("playback_shift"))}case 2:{let t=new URL(n);return Number(t.searchParams.get("offset_p")??0)}default:Qo(e)}};var w=(n,e,t=!1)=>{let i=n.getTransition();(t||!i||i.to===e)&&n.setState(e)};import{isNonNullable as id,Subject as Vs,merge as Wo}from"@vkontakte/videoplayer-shared/evergreen";var O=class{constructor(e){this.transitionStarted$=new Vs;this.transitionEnded$=new Vs;this.transitionUpdated$=new Vs;this.forceChanged$=new Vs;this.stateChangeStarted$=Wo(this.transitionStarted$,this.transitionUpdated$);this.stateChangeEnded$=Wo(this.transitionEnded$,this.forceChanged$);this.state=e,this.prevState=void 0}setState(e){let 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){let t=this.transition,i=this.state;i===e||id(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}};import{assertNever as rd}from"@vkontakte/videoplayer-shared/evergreen";var qo=n=>{switch(n){case"MPEG":case"DASH":case"DASH_SEP":case"DASH_ONDEMAND":case"DASH_WEBM":case"DASH_WEBM_AV1":case"DASH_STREAMS":case"HLS":case"HLS_ONDEMAND":return!1;case"DASH_LIVE":case"DASH_LIVE_CMAF":case"HLS_LIVE":case"HLS_LIVE_CMAF":case"DASH_LIVE_WEBM":case"WEB_RTC_LIVE":return!0;default:return rd(n)}};import{assertNever as mi,assertNonNullable as ei,debounce as Go,ErrorCategory as Yo,fromEvent as ti,isNonNullable as Ko,map as Xo,merge as Jo,observableFrom as sd,Subject as ad,Subscription as cn,timeout as nd,getHighestQuality as od}from"@vkontakte/videoplayer-shared/evergreen";var ud=5,ld=5,cd=500,Zo=7e3,Hi=class{constructor(e){this.subscription=new cn;this.loadMediaTimeoutSubscription=new cn;this.videoState=new O("stopped");this.syncPlayback=()=>{let e=this.videoState.getState(),t=this.videoState.getTransition(),i=this.params.desiredState.playbackState.getState(),r=this.params.desiredState.playbackState.getTransition(),s=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(s)};`}),i==="stopped"){e!=="stopped"&&(this.videoState.startTransitionTo("stopped"),this.stop());return}if(!t){if(r?.to!=="paused"&&s.state==="requested"&&e!=="stopped"){this.seek(s.position/1e3);return}switch(i){case"ready":{switch(e){case"playing":case"paused":case"ready":break;case"stopped":this.videoState.startTransitionTo("ready"),this.prepare();break;default:mi(e)}break}case"playing":{switch(e){case"playing":break;case"paused":this.videoState.startTransitionTo("playing"),this.params.connection.remotePlayerController.playOrPause();break;case"ready":this.videoState.startTransitionTo("playing"),this.params.connection.remotePlayerController.playOrPause();break;case"stopped":this.videoState.startTransitionTo("ready"),this.prepare();break;default:mi(e)}break}case"paused":{switch(e){case"playing":this.videoState.startTransitionTo("paused"),this.params.connection.remotePlayerController.playOrPause();break;case"paused":break;case"ready":this.videoState.startTransitionTo("paused"),this.videoState.setState("paused");break;case"stopped":this.videoState.startTransitionTo("ready"),this.prepare();break;default:mi(e)}break}default:mi(i)}}};this.params=e,this.log=this.params.dependencies.logger.createComponentLog("ChromecastProvider"),this.log({message:`constructor, format: ${e.format}`}),this.params.output.isLive$.next(qo(e.format)),this.params.output.isAudioAvailable$.next(!0),this.handleRemoteVolumeChange({volume:this.params.connection.remotePlayer.volumeLevel,muted:this.params.connection.remotePlayer.isMuted});let 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);let e=new cn;this.subscription.add(e),this.subscription.add(Jo(this.videoState.stateChangeStarted$.pipe(Xo(r=>`stateChangeStarted$ ${JSON.stringify(r)}`)),this.videoState.stateChangeEnded$.pipe(Xo(r=>`stateChangeEnded$ ${JSON.stringify(r)}`))).subscribe(r=>this.log({message:`[videoState] ${r}`})));let t=(r,s)=>this.subscription.add(r.subscribe(s));if(this.params.output.isLive$.getValue())this.params.output.position$.next(0),this.params.output.duration$.next(0);else{let r=new ad;e.add(r.pipe(Go(cd)).subscribe(()=>{this.params.output.seekedEvent$.next()}));let s=NaN;e.add(ti(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.CURRENT_TIME_CHANGED).subscribe(a=>{this.logRemoteEvent(a);let o=a.value;this.params.output.position$.next(o),(this.params.desiredState.seekState.getState().state==="applying"||Math.abs(o-s)>ud)&&r.next(o),s=o})),e.add(ti(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.DURATION_CHANGED).subscribe(a=>{this.logRemoteEvent(a),this.params.output.duration$.next(a.value)}))}t(ti(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MEDIA_LOADED_CHANGED),r=>{this.logRemoteEvent(r),r.value?this.handleRemoteReady():(this.handleRemoteStop(),e.unsubscribe())}),t(ti(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED),r=>{this.logRemoteEvent(r),r.value?this.handleRemotePause():this.handleRemotePlay()}),t(ti(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.PLAYER_STATE_CHANGED),r=>{this.logRemoteEvent(r);let{remotePlayer:s}=this.params.connection,a=r.value,o=this.params.output.isBuffering$.getValue(),u=a===chrome.cast.media.PlayerState.BUFFERING;switch(o!==u&&this.params.output.isBuffering$.next(u),a){case chrome.cast.media.PlayerState.IDLE:!this.params.output.isLive$.getValue()&&s.duration-s.currentTime<ld&&this.params.output.endedEvent$.next(),this.handleRemoteStop(),w(this.params.desiredState.playbackState,"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:mi(a)}}),t(ti(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED),r=>{this.logRemoteEvent(r),this.handleRemoteVolumeChange({volume:r.value})}),t(ti(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED),r=>{this.logRemoteEvent(r),this.handleRemoteVolumeChange({muted:r.value})});let i=Jo(this.params.desiredState.playbackState.stateChangeStarted$,this.params.desiredState.seekState.stateChangeEnded$,this.videoState.stateChangeEnded$,sd(["init"])).pipe(Go(0));t(i,this.syncPlayback)}restoreSession(e){this.log({message:"restoreSession"});let{remotePlayer:t}=this.params.connection;if(e.playerState!==chrome.cast.media.PlayerState.IDLE){t.isPaused?(this.videoState.setState("paused"),w(this.params.desiredState.playbackState,"paused")):(this.videoState.setState("playing"),w(this.params.desiredState.playbackState,"playing"));let 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:"none"})}}prepare(){let e=this.params.format;this.log({message:`[prepare] format: ${e}`});let t=this.createMediaInfo(e),i=this.createLoadRequest(t);this.loadMedia(i)}handleRemotePause(){let e=this.videoState.getState();(this.videoState.getTransition()?.to==="paused"||e==="playing")&&(this.videoState.setState("paused"),w(this.params.desiredState.playbackState,"paused"))}handleRemotePlay(){let e=this.videoState.getState();(this.videoState.getTransition()?.to==="playing"||e==="paused")&&(this.videoState.setState("playing"),w(this.params.desiredState.playbackState,"playing"))}handleRemoteReady(){this.videoState.getTransition()?.to==="ready"&&this.videoState.setState("ready"),this.params.desiredState.playbackState.getTransition()?.to==="ready"&&w(this.params.desiredState.playbackState,"ready")}handleRemoteStop(){this.videoState.getState()!=="stopped"&&this.videoState.setState("stopped")}handleRemoteVolumeChange(e){let 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();let{remotePlayer:t,remotePlayerController:i}=this.params.connection;t.currentTime=e,i.seek()}stop(){let{remotePlayerController:e}=this.params.connection;e.stop()}createMediaInfo(e){let t=this.params.source,i,r,s;switch(e){case"MPEG":{let l=t[e];ei(l);let d=od(Object.keys(l));ei(d);let p=l[d];ei(p),i=p,r="video/mp4",s=chrome.cast.media.StreamType.BUFFERED;break}case"HLS":case"HLS_ONDEMAND":{let l=t[e];ei(l),i=l.url,r="application/x-mpegurl",s=chrome.cast.media.StreamType.BUFFERED;break}case"DASH_SEP":case"DASH_ONDEMAND":case"DASH_WEBM":case"DASH_WEBM_AV1":case"DASH_STREAMS":{let l=t[e];ei(l),i=l.url,r="application/dash+xml",s=chrome.cast.media.StreamType.BUFFERED;break}case"DASH_LIVE_CMAF":{let l=t[e];ei(l),i=l.url,r="application/dash+xml",s=chrome.cast.media.StreamType.LIVE;break}case"HLS_LIVE":case"HLS_LIVE_CMAF":{let l=t[e];ei(l),i=pe(l.url),r="application/x-mpegurl",s=chrome.cast.media.StreamType.LIVE;break}case"DASH_LIVE":case"WEB_RTC_LIVE":{let l="Unsupported format for Chromecast",d=new Error(l);throw this.params.output.error$.next({id:"ChromecastProvider.createMediaInfo()",category:Yo.VIDEO_PIPELINE,message:l,thrown:d}),d}case"DASH":case"DASH_LIVE_WEBM":throw new Error(`${e} is no longer supported`);default:return mi(e)}let a=new chrome.cast.media.MediaInfo(this.params.meta.videoId??i,r);a.contentUrl=i,a.streamType=s,a.metadata=new chrome.cast.media.GenericMediaMetadata;let{title:o,subtitle:u}=this.params.meta;return Ko(o)&&(a.metadata.title=o),Ko(u)&&(a.metadata.subtitle=u),a}createLoadRequest(e){let t=new chrome.cast.media.LoadRequest(e);t.autoplay=!1;let i=this.params.desiredState.seekState.getState();return i.state==="applying"||i.state==="requested"?t.currentTime=this.params.output.isLive$.getValue()?0:i.position/1e3:t.currentTime=0,t}loadMedia(e){let t=this.params.connection.session.loadMedia(e),i=new Promise((r,s)=>{this.loadMediaTimeoutSubscription.add(nd(Zo).subscribe(()=>s(`timeout(${Zo})`)))});Promise.race([t,i]).then(()=>{this.log({message:`[loadMedia] completed, format: ${this.params.format}`}),this.params.desiredState.seekState.getState().state==="applying"&&this.params.output.seekedEvent$.next(),this.handleRemoteReady()},r=>{let s=`[prepare] loadMedia failed, format: ${this.params.format}, reason: ${r}`;this.log({message:s}),this.params.output.error$.next({id:"ChromecastProvider.loadMedia",category:Yo.VIDEO_PIPELINE,message:s,thrown:r})}).finally(()=>{this.loadMediaTimeoutSubscription.unsubscribe()})}logRemoteEvent(e){this.log({message:`[remoteEvent] ${JSON.stringify(e)}`})}};import{clearVideoElement as tu}from"@vkontakte/videoplayer-shared/evergreen";import{clearVideoElement as dd}from"@vkontakte/videoplayer-shared/evergreen";var eu=n=>{try{n.pause(),n.playbackRate=0,dd(n),n.remove()}catch(e){console.error(e)}};import{fromEvent as pd,Subscription as hd}from"@vkontakte/videoplayer-shared/evergreen";var dn=class{constructor(){this.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)}},pn=window.WeakMap?new WeakMap:new dn,hn=window.WeakMap?new WeakMap:new Map,md=(n,e=20)=>{let t=0;return pd(n,"ratechange").subscribe(i=>{t++,t>=e&&(n.currentTime=n.currentTime,t=0)})},ke=(n,{audioVideoSyncRate:e,disableYandexPiP:t})=>{let i=n.querySelector("video"),r=!!i;i?tu(i):(i=document.createElement("video"),n.appendChild(i)),pn.set(i,r);let s=new hd;return s.add(md(i,e)),hn.set(i,s),i.setAttribute("crossorigin","anonymous"),i.setAttribute("playsinline","playsinline"),t&&i.setAttribute("x-yandex-pip","false"),i.controls=!1,i.setAttribute("poster","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII="),i},Ae=n=>{hn.get(n)?.unsubscribe(),hn.delete(n);let t=pn.get(n);pn.delete(n),t?tu(n):eu(n)};import{assertNonNullable as ji,isNonNullable as mt,isNullable as gd,fromEvent as fi,merge as iu,observableFrom as ru,filterChanged as su,map as zi,Subject as au,Subscription as Sd,ValueSubject as vd,ErrorCategory as yd}from"@vkontakte/videoplayer-shared/evergreen";import{isNonNullable as mn,isNullable as fd,Subscription as bd}from"@vkontakte/videoplayer-shared/evergreen";var Cs=(n,e,t,{equal:i=(a,o)=>a===o,changed$:r,onError:s}={})=>{let a=n.getState(),o=e(),u=fd(r),l=new bd;return r&&l.add(r.subscribe(d=>{let p=n.getState();i(d,p)&&n.setState(d)},s)),i(o,a)||(t(a),u&&n.setState(a)),l.add(n.stateChangeStarted$.subscribe(d=>{t(d.to),u&&n.setState(d.to)},s)),l},rt=(n,e,t)=>Cs(e,()=>n.loop,i=>{mn(i)&&(n.loop=i)},{onError:t}),we=(n,e,t,i)=>Cs(e,()=>({muted:n.muted,volume:n.volume}),r=>{mn(r)&&(n.muted=r.muted,n.volume=r.volume)},{equal:(r,s)=>r===s||r?.muted===s?.muted&&r?.volume===s?.volume,changed$:t,onError:i}),He=(n,e,t,i)=>Cs(e,()=>n.playbackRate,r=>{mn(r)&&(n.playbackRate=r)},{changed$:t,onError:i}),_t=Cs;var Td=n=>["__",n.language,n.label].join("|"),Id=(n,e)=>{if(n.id===e)return!0;let[t,i,r]=e.split("|");return n.language===i&&n.label===r},fn=class n{constructor(e){this.available$=new au;this.current$=new vd(void 0);this.error$=new au;this.subscription=new Sd;this.externalTracks=new Map;this.internalTracks=new Map;this.baseURL=e}connect(e,t,i){this.video=e,this.cueSettings=t.textTrackCuesSettings,this.subscribe();let r=s=>{this.error$.next({id:"TextTracksManager",category:yd.WTF,message:"Generic HtmlVideoTextTrackManager error",thrown:s})};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(_t(t.internalTextTracks,()=>Object.values(this.internalTracks),s=>{mt(s)&&this.setInternal(s)},{equal:(s,a)=>mt(s)&&mt(a)&&s.length===a.length&&s.every(({id:o},u)=>o===a[u].id),changed$:this.available$.pipe(zi(s=>s.filter(({type:a})=>a==="internal"))),onError:r})),this.subscription.add(_t(t.externalTextTracks,()=>Object.values(this.externalTracks),s=>{mt(s)&&this.setExternal(s)},{equal:(s,a)=>mt(s)&&mt(a)&&s.length===a.length&&s.every(({id:o},u)=>o===a[u].id),changed$:this.available$.pipe(zi(s=>s.filter(({type:a})=>a==="external"))),onError:r})),this.subscription.add(_t(t.currentTextTrack,()=>{if(this.video)return;let s=this.htmlTextTracksAsArray().find(({mode:a})=>a==="showing");return s&&this.htmlTextTrackToITextTrack(s).id},s=>this.select(s),{changed$:this.current$,onError:r})),this.subscription.add(_t(t.textTrackCuesSettings,()=>({}),()=>{if(this.video)for(let s of this.htmlTextTracksAsArray())this.applyCueSettings(s.cues),this.applyCueSettings(s.activeCues)}))}subscribe(){ji(this.video);let{textTracks:e}=this.video;this.subscription.add(fi(e,"addtrack").subscribe(()=>{let i=this.current$.getValue();i&&this.select(i)})),this.subscription.add(iu(fi(e,"addtrack"),fi(e,"removetrack"),ru(["init"])).pipe(zi(()=>this.htmlTextTracksAsArray().map(i=>this.htmlTextTrackToITextTrack(i))),su((i,r)=>i.length===r.length&&i.every(({id:s},a)=>s===r[a].id))).subscribe(this.available$)),this.subscription.add(iu(fi(e,"change"),ru(["init"])).pipe(zi(()=>this.htmlTextTracksAsArray().find(({mode:i})=>i==="showing")),zi(i=>i&&this.htmlTextTrackToITextTrack(i).id),su()).subscribe(this.current$));let t=i=>this.applyCueSettings(i.target?.activeCues??null);this.subscription.add(fi(e,"addtrack").subscribe(i=>{i.track?.addEventListener("cuechange",t);let r=s=>{let a=s.target?.cues??null;a&&a.length&&(this.applyCueSettings(s.target?.cues??null),s.target?.removeEventListener("cuechange",r))};i.track?.addEventListener("cuechange",r)})),this.subscription.add(fi(e,"removetrack").subscribe(i=>{i.track?.removeEventListener("cuechange",t)}))}applyCueSettings(e){if(!e||!e.length)return;let t=this.cueSettings.getState();for(let i of Array.from(e)){let r=i;mt(t.align)&&(r.align=t.align),mt(t.position)&&(r.position=t.position),mt(t.size)&&(r.size=t.size),mt(t.line)&&(r.line=t.line)}}htmlTextTracksAsArray(e=!1){ji(this.video);let t=[...this.video.textTracks];return e?t:t.filter(n.isHealthyTrack)}htmlTextTrackToITextTrack(e){let{language:t,label:i}=e,r=e.id?e.id:Td(e),s=this.externalTracks.has(r),a=(s?this.externalTracks.get(r)?.isAuto:this.internalTracks.get(r)?.isAuto)??r.includes("auto");return s?{id:r,type:"external",isAuto:a,language:t,label:i,url:this.externalTracks.get(r)?.url}:{id:r,type:"internal",isAuto:a,language:t,label:i,url:this.internalTracks.get(r)?.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){let t=[...this.externalTracks];e.filter(({id:i,language:r,isAuto:s})=>!this.internalTracks.has(i)&&!t.some(([,a])=>a.language===r&&a.isAuto===s)).forEach(i=>this.attach(i)),Array.from(this.internalTracks).filter(([i])=>!e.find(r=>r.id===i)).forEach(([,i])=>this.detach(i))}select(e){ji(this.video);for(let t of this.htmlTextTracksAsArray(!0))t.mode="showing";for(let t of this.htmlTextTracksAsArray(!0))(gd(e)||!Id(t,e))&&(t.mode="disabled")}destroy(){if(this.subscription.unsubscribe(),this.video)for(let e of Array.from(this.video.getElementsByTagName("track"))){let t=e.getAttribute("id");t&&this.externalTracks.has(t)&&this.video.removeChild(e)}this.externalTracks.clear()}attach(e){ji(this.video);let t=document.createElement("track");this.baseURL?t.setAttribute("src",new URL(e.url,this.baseURL).toString()):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){ji(this.video);let 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)}},je=fn;var ii=class{constructor(){this.pausedTime=0;this.streamOffset=0;this.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()}};var nu=n=>{let e=n;for(;!(e instanceof Document)&&!(e instanceof ShadowRoot)&&e!==null;)e=e?.parentNode;return e??void 0},bn=n=>{let e=nu(n);return!!(e&&e.fullscreenElement&&e.fullscreenElement===n)},ou=n=>{let e=nu(n);return!!(e&&e.pictureInPictureElement&&e.pictureInPictureElement===n)};import{fromEvent as Oe,map as At,merge as js,filterChanged as $d,isNonNullable as mu,Subject as Bd,filter as Sn,mapTo as vn,combine as fu,once as Rd,throttle as Dd,ErrorCategory as Vd,ValueSubject as bu,Subscription as Cd}from"@vkontakte/videoplayer-shared/evergreen";var xd=3,uu=(n,e,t=xd)=>{let i=0,r=0;for(let s=0;s<n.length;s++){let a=n.start(s),o=n.end(s);if(a<=e&&e<=o){if(i=a,r=o,!t)return{from:i,to:r};for(let u=s-1;u>=0;u--)n.end(u)+t>=i&&(i=n.start(u));for(let u=s+1;u<n.length;u++)n.start(u)-t<=r&&(r=n.end(u))}}return{from:i,to:r}};var Os=class{get current(){return this._current}get isYandex(){return this.current==="Yandex"}get isSafari(){return this.current==="Safari"}get isSamsungBrowser(){return this.current==="SamsungBrowser"}get safariVersion(){return this._safariVersion}detect(){let{userAgent:e}=navigator;try{let t=/yabrowser/i.test(e)?"Yandex":void 0,i=/samsungbrowser/i.test(e)?"SamsungBrowser":void 0,r=/chrome|crios/i.test(e)?"Chrome":void 0,s=/chromium/i.test(e)?"Chromium":void 0,a=/firefox|fxios/i.test(e)?"Firefox":void 0,o=/webkit|safari|khtml/i.test(e)?"Safari":void 0,u=/opr\//i.test(e)?"Opera":void 0,l=/edg/i.test(e)?"Edge":void 0;this._current=t||i||a||u||l||r||s||o||"Rest"}catch(t){console.error(t)}this.isSafari&&this.detectSafariVersion()}detectSafariVersion(){try{let{userAgent:e}=window.navigator,t=e.match(/Version\/(\d+)/);if(!t)return;let i=t[1],r=parseInt(i,10);if(isNaN(r))return;this._safariVersion=r}catch(e){console.error(e)}}};var Qi=()=>/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(navigator.appVersion??navigator.userAgent)||navigator?.userAgentData?.mobile;var Fs=class{constructor(e){this._highEntropyValues={};this._displayChecker=e}get current(){return this._current}get isIOS(){let e=["iPhone","iPad","iPod"];return this._highEntropyValues.platform==="iOS"||e.includes(this.current)}get isMac(){return this._highEntropyValues.platform==="macOS"||this.current==="Mac"}get isApple(){return this.isIOS||this.isMac}get isIphoneOrOldIpad(){if(!this.isApple||!this._displayChecker.isTouch)return!1;let e=this.current==="iPad"||this._displayChecker.width>700,t=this._iosVersion;return!e||e&&!!t&&t<16}get isAndroid(){return this._highEntropyValues.platform==="Android"||this.current==="Android"}get isMobile(){return this._highEntropyValues.mobile||this._isMobile}get iOSVersion(){return this._iosVersion}detect(){let{userAgent:e}=navigator;try{this._isMobile=Qi()}catch(t){console.error(t)}this.detectDevice(e),this.detectHighEntropyValues(),this.isIOS&&this.detectIOSVersion()}async detectHighEntropyValues(){let{userAgentData:e}=navigator;if(e?.getHighEntropyValues){let t=await e.getHighEntropyValues(["architecture","bitness","brands","mobile","platform","formFactor","model","platformVersion","wow64"]);this._highEntropyValues=t}}detectDevice(e){try{let t=/android/i.test(e)?"Android":void 0,i=/iphone/i.test(e)?"iPhone":void 0,r=/ipad/i.test(e)?"iPad":void 0,s=/ipod/i.test(e)?"iPod":void 0,a=/mac/i.test(e)?"Mac":void 0,o=/webOS|BlackBerry|IEMobile|Opera Mini/i.test(e)?"RestMobile":void 0;this._current=t||i||r||s||o||a||"Desktop"}catch(t){console.error(t)}}detectIOSVersion(){try{if(this._highEntropyValues.platformVersion){let s=this._highEntropyValues.platformVersion.split(".").slice(0,2).join("."),a=parseFloat(s);this._iosVersion=a;return}let{userAgent:e}=window.navigator,t=e.match(/OS (\d+(_\d+)?)/i);if(!t)return;let i=t[1].replace(/_/g,".");if(!i)return;let r=parseFloat(i);if(isNaN(r))return;this._iosVersion=r}catch(e){console.error(e)}}};var Ns=class{get isTouch(){return typeof this._maxTouchPoints=="number"?this._maxTouchPoints>1:"ontouchstart"in window}get maxTouchPoints(){return this._maxTouchPoints}get height(){return this._height}get width(){return this._width}get screenHeight(){return this._screenHeight}get screenWidth(){return this._screenWidth}get pixelRatio(){return this._pixelRatio}get isHDR(){return this._isHdr}get colorDepth(){return this._colorDepth}detect(){let{maxTouchPoints:e}=navigator;try{this._maxTouchPoints=e??0,this._isHdr=!!matchMedia("(dynamic-range: high)")?.matches,this._colorDepth=screen.colorDepth}catch(t){console.error(t)}try{this._pixelRatio=window.devicePixelRatio||1,this._height=screen.height,this._width=screen.width,this._height=screen.height,this._screenHeight=this._height*this._pixelRatio,this._screenWidth=this._width*this._pixelRatio}catch(t){console.error(t)}}};var tt=()=>window.ManagedMediaSource||window.MediaSource,bi=()=>!!(window.ManagedMediaSource&&window.ManagedSourceBuffer?.prototype?.appendBuffer),lu=()=>!!(window.MediaSource&&window.SourceBuffer?.prototype?.appendBuffer),_s=()=>window.ManagedMediaSource?new ManagedMediaSource:new MediaSource;var Ed=document.createElement("video"),kd='video/mp4; codecs="avc1.42000a,mp4a.40.2"',Ad='video/mp4; codecs="hev1.1.6.L93.B0"',cu='video/webm; codecs="vp09.00.10.08"',du='video/webm; codecs="av01.0.00M.08"',wd='audio/mp4; codecs="mp4a.40.2"',Pd='audio/webm; codecs="opus"',pu,Ld=async()=>{if(!window.navigator.mediaCapabilities)return;let n={type:"media-source",video:{contentType:"video/webm",width:1280,height:720,bitrate:1e6,framerate:30}},[e,t]=await Promise.all([window.navigator.mediaCapabilities.decodingInfo({...n,video:{...n.video,contentType:du}}),window.navigator.mediaCapabilities.decodingInfo({...n,video:{...n.video,contentType:cu}})]);pu={DASH_WEBM_AV1:e,DASH_WEBM:t}};Ld().catch(n=>{console.log(Ed),console.error(n)});var Us=class{constructor(e,t){this._deviceChecker=e,this._browserChecker=t}get protocols(){return this._protocols}get containers(){return this._containers}get codecs(){return this._codecs}get webmDecodingInfo(){return pu}get supportedCodecs(){return Object.keys(this._codecs).filter(e=>this._codecs[e])}get nativeHlsSupported(){return this._nativeHlsSupported}detect(){this._video=document.createElement("video");try{this._protocols={mms:bi(),mse:lu(),hls:!!(this._video.canPlayType?.("application/x-mpegurl")||this._video.canPlayType?.("vnd.apple.mpegURL")),webrtc:!!window.RTCPeerConnection,ws:!!window.WebSocket},this._containers={mp4:!!this._video.canPlayType?.("video/mp4"),webm:!!this._video.canPlayType?.("video/webm"),cmaf:!0};let e=!!tt()?.isTypeSupported?.(kd),t=!!tt()?.isTypeSupported?.(Ad),i=!!tt()?.isTypeSupported?.(wd);this._codecs={h264:e,h265:t,vp9:!!tt()?.isTypeSupported?.(cu),av1:!!tt()?.isTypeSupported?.(du),aac:i,opus:!!tt()?.isTypeSupported?.(Pd),mpeg:(e||t)&&i},this._nativeHlsSupported=this._protocols.hls&&this._containers.mp4}catch(e){console.error(e)}this.destroyVideoElement()}destroyVideoElement(){if(!this._video)return;if(this._video.pause(),this._video.currentTime=0,this._video.removeAttribute("src"),this._video.src="",this._video.load(),this._video.remove){this._video.remove(),this._video=null;return}this._video.parentNode&&this._video.parentNode.removeChild(this._video);let e=this._video.cloneNode(!1);this._video.parentNode?.replaceChild(e,this._video),this._video=null}};var hu="audio/mpeg",Hs=class{supportMp3(){return this._codecs.mp3&&this._containers.mpeg}detect(){this._audio=document.createElement("audio");try{this._containers={mpeg:!!this._audio.canPlayType?.(hu)},this._codecs={mp3:!!tt()?.isTypeSupported?.(hu)}}catch(e){console.error(e)}this.destroyAudioElement()}destroyAudioElement(){if(!this._audio)return;if(this._audio.pause(),this._audio.currentTime=0,this._audio.removeAttribute("src"),this._audio.src="",this._audio.load(),this._audio.remove){this._audio.remove(),this._audio=null;return}this._audio.parentNode&&this._audio.parentNode.removeChild(this._audio);let e=this._audio.cloneNode(!1);this._audio.parentNode?.replaceChild(e,this._audio),this._audio=null}};import{ValueSubject as Md}from"@vkontakte/videoplayer-shared/evergreen";var gn=class{constructor(){this.isInited$=new Md(!1);this._displayChecker=new Ns,this._deviceChecker=new Fs(this._displayChecker),this._browserChecker=new Os,this._videoChecker=new Us(this._deviceChecker,this._browserChecker),this._audioChecker=new Hs,this.detect()}get display(){return this._displayChecker}get device(){return this._deviceChecker}get browser(){return this._browserChecker}get video(){return this._videoChecker}get audio(){return this._audioChecker}async detect(){this._displayChecker.detect(),this._deviceChecker.detect(),this._browserChecker.detect(),this._videoChecker.detect(),this._audioChecker.detect(),this.isInited$.next(!0)}},C=new gn;var Pe=n=>{let e=b=>Oe(n,b).pipe(vn(void 0)),t=new Cd,i=()=>t.unsubscribe(),r=js(Oe(n,"progress"),Oe(n,"timeupdate")).pipe(At(()=>uu(n.buffered,n.currentTime))),s=C.browser.isSafari?fu({play:e("play").pipe(Rd()),playing:e("playing")}).pipe(vn(void 0)):e("playing"),a=Oe(n,"volumechange").pipe(At(()=>({muted:n.muted,volume:n.volume}))),o=Oe(n,"ratechange").pipe(At(()=>n.playbackRate)),u=Oe(n,"error").pipe(Sn(()=>!!(n.error||n.played.length)),At(()=>{let b=n.error;return{id:b?`MediaError#${b.code}`:"HtmlVideoError",category:Vd.VIDEO_PIPELINE,message:b?b.message:"Error event from HTML video element",thrown:n.error??void 0}})),l=Oe(n,"timeupdate").pipe(At(()=>n.currentTime)),d=["waiting","seeking","seeked","timeupdate"],p=new Bd,c=.3,h;t.add(js(...d.map(b=>Oe(n,b))).subscribe(b=>{let R=n.currentTime;n.loop&&mu(h)&&mu(R)&&h>=n.duration-c&&R<=c&&p.next(h),h=R}));let m=e("pause").pipe(Sn(()=>!n.error&&h!==n.duration)),f=Oe(n,"enterpictureinpicture"),g=Oe(n,"leavepictureinpicture"),S=new bu(ou(n));t.add(f.subscribe(()=>S.next(!0))),t.add(g.subscribe(()=>S.next(!1)));let k=new bu(bn(n)),v=Oe(n,"fullscreenchange");t.add(v.pipe(At(()=>bn(n))).subscribe(k));let I=.1,x=1e3,M=Oe(n,"timeupdate").pipe(At(b=>n.duration-n.currentTime<I)),V=js(M.pipe(Sn(b=>!n.loop&&b)),Oe(n,"ended")).pipe(Dd(x),vn(void 0)),A=fu({latestNativeEvent:js(...["waiting","pause","canplay","play","canplaythrough","playing","seeking","seeked","ended"].map(b=>Oe(n,b))),endedExpected:M}).pipe(At(({endedExpected:b})=>b?n.readyState<2:n.readyState<3),$d());return{playing$:s,pause$:m,canplay$:e("canplay"),ended$:V,looped$:p,error$:u,seeked$:e("seeked"),seeking$:e("seeking"),progress$:e("progress"),loadStart$:e("loadstart"),loadedMetadata$:e("loadedmetadata"),loadedData$:e("loadeddata"),timeUpdate$:l,durationChange$:Oe(n,"durationchange").pipe(At(()=>n.duration)),isBuffering$:A,currentBuffer$:r,volumeState$:a,playbackRateState$:o,inPiP$:S,inFullscreen$:k,enterPip$:f,leavePip$:g,destroy:i}};import{VideoQuality as Ut}from"@vkontakte/videoplayer-shared/evergreen";var ft=n=>{switch(n){case"mobile":return Ut.Q_144P;case"lowest":return Ut.Q_240P;case"low":return Ut.Q_360P;case"sd":case"medium":return Ut.Q_480P;case"hd":case"high":return Ut.Q_720P;case"fullhd":case"full":return Ut.Q_1080P;case"quadhd":case"quad":return Ut.Q_1440P;case"ultrahd":case"ultra":return Ut.Q_2160P}};import{isNonNullable as Y,isNullable as Gs,now as Au,isHigher as Ys,isHigherOrEqual as Si,isInvariantQuality as Ks,isLowerOrEqual as vi,videoSizeToQuality as wu,assertNotEmptyArray as Xs,assertNonNullable as Pu}from"@vkontakte/videoplayer-shared/evergreen";var yn=!1,wt={},gu=n=>{yn=n},Su=()=>{wt={}},vu=n=>{n(wt)},Wi=(n,e)=>{yn&&(wt.meta=wt.meta??{},wt.meta[n]=e)},Fe=class{constructor(e){this.name=e}next(e){if(!yn)return;wt.series=wt.series??{};let t=wt.series[this.name]??[];t.push([Date.now(),e]),wt.series[this.name]=t}};import{isHigher as Od,isHigherOrEqual as Kg,isLower as yu,isLowerOrEqual as Xg,isNonNullable as zs,isNullable as Fd,videoHeightToQuality as Qs}from"@vkontakte/videoplayer-shared/evergreen";function Tn(n,e,t){return!n.max&&n.min===e?"high_quality":!n.min&&n.max===t?"traffic_saving":"unknown"}function Ws(n,e,t){return!!n&&Tn(n,e,t)==="high_quality"}function gi(n,e,t){return Fd(n)||zs(n.min)&&zs(n.max)&&yu(n.max,n.min)||zs(n.min)&&e&&Od(n.min,e)||zs(n.max)&&t&&yu(n.max,t)}function Tu({limits:n,highestAvailableHeight:e,lowestAvailableHeight:t}){return gi({max:n?.max?Qs(n.max):void 0,min:n?.min?Qs(n.min):void 0},e?Qs(e):void 0,t?Qs(t):void 0)}var Lu=new Fe("best_bitrate"),Js=(n,e,t)=>(e-t)*Math.pow(2,-10*n)+t;var yi=n=>(e,t)=>n*(Number(e.bitrate)-Number(t.bitrate)),Ht=class{constructor(){this.history={}}recordSelection(e){this.history[e.id]=Au()}recordSwitch(e){this.last=e}clear(){this.last=void 0,this.history={}}},Zs='Assertion "ABR Tracks is empty array" failed',qs=new WeakMap,Iu=new WeakMap,xu=new WeakMap,qi=(n,e,t,i)=>{let r=[...e].sort(yi(1)),s=[...t].sort(yi(1)),a=s.filter(u=>Y(u.bitrate)&&Y(n.bitrate)?n.bitrate/u.bitrate>i:!0),o=s.at(Math.round(s.length*r.indexOf(n)/(r.length+1)))??s.at(-1);return o&&a.includes(o)?o:a.length?a.at(-1):s.at(0)},Gi=(n,e,t,i)=>{let r=qs.get(e);r||(r=[...e].sort(yi(1)),qs.set(e,r));let s=qs.get(t);s||(s=[...t].sort(yi(1)),qs.set(t,s));let a=xu.get(n);a||(a=s.filter(u=>Y(u.bitrate)&&Y(n.bitrate)?n.bitrate/u.bitrate>i:!0),xu.set(n,a));let o=s.at(Math.round(s.length*r.indexOf(n)/(r.length+1)))??s.at(-1);return o&&a.includes(o)?o:a.length?a.at(-1):s.at(0)},Eu=n=>"quality"in n,ea=(n,e,t,i)=>{let r=Y(i?.last?.bitrate)&&Y(t?.bitrate)&&i.last.bitrate<t.bitrate?n.trackCooldownIncreaseQuality:n.trackCooldownDecreaseQuality,s=t&&i&&i.history[t.id]&&Au()-i.history[t.id]<=r&&(!i.last||t.id!==i.last.id);if(t?.id&&i&&!s&&i.recordSelection(t),s&&i?.last){let a=i.last;i?.recordSwitch(a);let o=Eu(a)?"video":"audio",u=Eu(a)?a.quality:a.bitrate;return e({message:`
6
+ var Fo="2.0.132-dev.bc968375.0";var Ue=(r=>(r.STOPPED="stopped",r.READY="ready",r.PLAYING="playing",r.PAUSED="paused",r))(Ue||{}),kt=(v=>(v.MPEG="MPEG",v.DASH="DASH",v.DASH_SEP="DASH_SEP",v.DASH_SEP_VK="DASH_SEP",v.DASH_WEBM="DASH_WEBM",v.DASH_WEBM_AV1="DASH_WEBM_AV1",v.DASH_STREAMS="DASH_STREAMS",v.DASH_WEBM_VK="DASH_WEBM",v.DASH_ONDEMAND="DASH_ONDEMAND",v.DASH_ONDEMAND_VK="DASH_ONDEMAND",v.DASH_LIVE="DASH_LIVE",v.DASH_LIVE_CMAF="DASH_LIVE_CMAF",v.DASH_LIVE_WEBM="DASH_LIVE_WEBM",v.HLS="HLS",v.HLS_ONDEMAND="HLS_ONDEMAND",v.HLS_JS="HLS",v.HLS_LIVE="HLS_LIVE",v.HLS_LIVE_CMAF="HLS_LIVE_CMAF",v.WEB_RTC_LIVE="WEB_RTC_LIVE",v))(kt||{});var $s=(r=>(r.NOT_AVAILABLE="NOT_AVAILABLE",r.AVAILABLE="AVAILABLE",r.CONNECTING="CONNECTING",r.CONNECTED="CONNECTED",r))($s||{}),nn=(i=>(i.HTTP1="http1",i.HTTP2="http2",i.QUIC="quic",i))(nn||{});var on=(a=>(a.NONE="none",a.INLINE="inline",a.FULLSCREEN="fullscreen",a.SECOND_SCREEN="second_screen",a.PIP="pip",a.INVISIBLE="invisible",a))(on||{}),Bs=(i=>(i.TRAFFIC_SAVING="traffic_saving",i.HIGH_QUALITY="high_quality",i.UNKNOWN="unknown",i))(Bs||{});import{assertNever as zo,assertNonNullable as Yc,isNonNullable as Rs,ValueSubject as un,Subject as Kc,Subscription as Xc,merge as Jc,observableFrom as Zc,fromEvent as _o,map as Uo,tap as Ho,filterChanged as ed,isNullable as ln,ErrorCategory as jo}from"@vkontakte/videoplayer-shared/evergreen";var No=n=>new Promise((e,t)=>{let i=document.createElement("script");i.setAttribute("src",n),i.onload=()=>e(),i.onerror=r=>t(r),document.body.appendChild(i)});var Ds=class{constructor(e){this.connection$=new un(void 0);this.castState$=new un("NOT_AVAILABLE");this.errorEvent$=new Kc;this.realCastState$=new un("NOT_AVAILABLE");this.subscription=new Xc;this.isDestroyed=!1;this.params=e,this.log=this.params.dependencies.logger.createComponentLog("ChromecastInitializer");let t="chrome"in window;if(this.log({message:`[constructor] receiverApplicationId: ${this.params.receiverApplicationId}, isDisabled: ${this.params.isDisabled}, isSupported: ${t}`}),e.isDisabled||!t)return;let i=Rs(window.chrome?.cast),r=!!window.__onGCastApiAvailable;i?this.initializeCastApi():(window.__onGCastApiAvailable=s=>{delete window.__onGCastApiAvailable,s&&!this.isDestroyed&&this.initializeCastApi()},r||No("https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1").catch(()=>this.errorEvent$.next({id:"ChromecastLoading",category:jo.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(){Rs(this.connection$.getValue())?this.disconnect():this.connect()}setVolume(e){let t=this.connection$.getValue();ln(t)||(t.remotePlayer.volumeLevel=e,t.remotePlayerController.setVolumeLevel())}setMuted(e){let t=this.connection$.getValue();ln(t)||e!==t.remotePlayer.isMuted&&t.remotePlayerController.muteOrUnmute()}destroy(){this.isDestroyed=!0,this.subscription.unsubscribe()}initListeners(){let e=new cast.framework.RemotePlayer,t=new cast.framework.RemotePlayerController(e),i=cast.framework.CastContext.getInstance();this.subscription.add(_o(i,cast.framework.CastContextEventType.SESSION_STATE_CHANGED).subscribe(r=>{switch(r.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 zo(r.sessionState)}})).add(Jc(_o(i,cast.framework.CastContextEventType.CAST_STATE_CHANGED).pipe(Ho(r=>{this.log({message:`[cast.framework.RemotePlayerEventType.CAST_STATE_CHANGED]: ${JSON.stringify(r)}`})}),Uo(r=>r.castState)),Zc([i.getCastState()])).pipe(ed(),Uo(td),Ho(r=>{this.log({message:`realCastState$: ${r}`})})).subscribe(this.realCastState$)).add(this.realCastState$.subscribe(r=>{let s=r==="CONNECTED",a=Rs(this.connection$.getValue());if(s&&!a){let o=i.getCurrentSession();Yc(o);let u=o.getCastDevice(),l=o.getMediaSession()?.media?.contentId;(ln(l)||l===this.contentId)&&(this.log({message:"connection created"}),this.connection$.next({remotePlayer:e,remotePlayerController:t,session:o,castDevice:u}))}else!s&&a&&(this.log({message:"connection destroyed"}),this.connection$.next(void 0));this.castState$.next(r==="CONNECTED"?Rs(this.connection$.getValue())?"CONNECTED":"AVAILABLE":r)}))}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(r){this.errorEvent$.next({id:"ChromecastInitializer",category:jo.EXTERNAL_API,message:"[initializeCastApi] failed",thrown:r})}}},td=n=>{switch(n){case cast.framework.CastState.NO_DEVICES_AVAILABLE:return"NOT_AVAILABLE";case cast.framework.CastState.NOT_CONNECTED:return"AVAILABLE";case cast.framework.CastState.CONNECTING:return"CONNECTING";case cast.framework.CastState.CONNECTED:return"CONNECTED";default:return zo(n)}};import{assertNever as Qo}from"@vkontakte/videoplayer-shared/evergreen";var pe=(n,e=0,t=0)=>{switch(t){case 0:return n.replace("_offset_p",e===0?"":"_"+e.toFixed(0));case 1:{if(e===0)return n;let i=new URL(n);return i.searchParams.append("playback_shift",e.toFixed(0)),i.toString()}case 2:{let i=new URL(n);return!i.searchParams.get("offset_p")&&e===0?n:(i.searchParams.set("offset_p",e.toFixed(0)),i.toString())}default:Qo(t)}return n},Nt=(n,e)=>{switch(e){case 0:return NaN;case 1:{let t=new URL(n);return Number(t.searchParams.get("playback_shift"))}case 2:{let t=new URL(n);return Number(t.searchParams.get("offset_p")??0)}default:Qo(e)}};var w=(n,e,t=!1)=>{let i=n.getTransition();(t||!i||i.to===e)&&n.setState(e)};import{isNonNullable as id,Subject as Vs,merge as Wo}from"@vkontakte/videoplayer-shared/evergreen";var O=class{constructor(e){this.transitionStarted$=new Vs;this.transitionEnded$=new Vs;this.transitionUpdated$=new Vs;this.forceChanged$=new Vs;this.stateChangeStarted$=Wo(this.transitionStarted$,this.transitionUpdated$);this.stateChangeEnded$=Wo(this.transitionEnded$,this.forceChanged$);this.state=e,this.prevState=void 0}setState(e){let 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){let t=this.transition,i=this.state;i===e||id(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}};import{assertNever as rd}from"@vkontakte/videoplayer-shared/evergreen";var qo=n=>{switch(n){case"MPEG":case"DASH":case"DASH_SEP":case"DASH_ONDEMAND":case"DASH_WEBM":case"DASH_WEBM_AV1":case"DASH_STREAMS":case"HLS":case"HLS_ONDEMAND":return!1;case"DASH_LIVE":case"DASH_LIVE_CMAF":case"HLS_LIVE":case"HLS_LIVE_CMAF":case"DASH_LIVE_WEBM":case"WEB_RTC_LIVE":return!0;default:return rd(n)}};import{assertNever as mi,assertNonNullable as ei,debounce as Go,ErrorCategory as Yo,fromEvent as ti,isNonNullable as Ko,map as Xo,merge as Jo,observableFrom as sd,Subject as ad,Subscription as cn,timeout as nd,getHighestQuality as od}from"@vkontakte/videoplayer-shared/evergreen";var ud=5,ld=5,cd=500,Zo=7e3,Hi=class{constructor(e){this.subscription=new cn;this.loadMediaTimeoutSubscription=new cn;this.videoState=new O("stopped");this.syncPlayback=()=>{let e=this.videoState.getState(),t=this.videoState.getTransition(),i=this.params.desiredState.playbackState.getState(),r=this.params.desiredState.playbackState.getTransition(),s=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(s)};`}),i==="stopped"){e!=="stopped"&&(this.videoState.startTransitionTo("stopped"),this.stop());return}if(!t){if(r?.to!=="paused"&&s.state==="requested"&&e!=="stopped"){this.seek(s.position/1e3);return}switch(i){case"ready":{switch(e){case"playing":case"paused":case"ready":break;case"stopped":this.videoState.startTransitionTo("ready"),this.prepare();break;default:mi(e)}break}case"playing":{switch(e){case"playing":break;case"paused":this.videoState.startTransitionTo("playing"),this.params.connection.remotePlayerController.playOrPause();break;case"ready":this.videoState.startTransitionTo("playing"),this.params.connection.remotePlayerController.playOrPause();break;case"stopped":this.videoState.startTransitionTo("ready"),this.prepare();break;default:mi(e)}break}case"paused":{switch(e){case"playing":this.videoState.startTransitionTo("paused"),this.params.connection.remotePlayerController.playOrPause();break;case"paused":break;case"ready":this.videoState.startTransitionTo("paused"),this.videoState.setState("paused");break;case"stopped":this.videoState.startTransitionTo("ready"),this.prepare();break;default:mi(e)}break}default:mi(i)}}};this.params=e,this.log=this.params.dependencies.logger.createComponentLog("ChromecastProvider"),this.log({message:`constructor, format: ${e.format}`}),this.params.output.isLive$.next(qo(e.format)),this.params.output.isAudioAvailable$.next(!0),this.handleRemoteVolumeChange({volume:this.params.connection.remotePlayer.volumeLevel,muted:this.params.connection.remotePlayer.isMuted});let 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);let e=new cn;this.subscription.add(e),this.subscription.add(Jo(this.videoState.stateChangeStarted$.pipe(Xo(r=>`stateChangeStarted$ ${JSON.stringify(r)}`)),this.videoState.stateChangeEnded$.pipe(Xo(r=>`stateChangeEnded$ ${JSON.stringify(r)}`))).subscribe(r=>this.log({message:`[videoState] ${r}`})));let t=(r,s)=>this.subscription.add(r.subscribe(s));if(this.params.output.isLive$.getValue())this.params.output.position$.next(0),this.params.output.duration$.next(0);else{let r=new ad;e.add(r.pipe(Go(cd)).subscribe(()=>{this.params.output.seekedEvent$.next()}));let s=NaN;e.add(ti(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.CURRENT_TIME_CHANGED).subscribe(a=>{this.logRemoteEvent(a);let o=a.value;this.params.output.position$.next(o),(this.params.desiredState.seekState.getState().state==="applying"||Math.abs(o-s)>ud)&&r.next(o),s=o})),e.add(ti(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.DURATION_CHANGED).subscribe(a=>{this.logRemoteEvent(a),this.params.output.duration$.next(a.value)}))}t(ti(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MEDIA_LOADED_CHANGED),r=>{this.logRemoteEvent(r),r.value?this.handleRemoteReady():(this.handleRemoteStop(),e.unsubscribe())}),t(ti(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED),r=>{this.logRemoteEvent(r),r.value?this.handleRemotePause():this.handleRemotePlay()}),t(ti(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.PLAYER_STATE_CHANGED),r=>{this.logRemoteEvent(r);let{remotePlayer:s}=this.params.connection,a=r.value,o=this.params.output.isBuffering$.getValue(),u=a===chrome.cast.media.PlayerState.BUFFERING;switch(o!==u&&this.params.output.isBuffering$.next(u),a){case chrome.cast.media.PlayerState.IDLE:!this.params.output.isLive$.getValue()&&s.duration-s.currentTime<ld&&this.params.output.endedEvent$.next(),this.handleRemoteStop(),w(this.params.desiredState.playbackState,"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:mi(a)}}),t(ti(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED),r=>{this.logRemoteEvent(r),this.handleRemoteVolumeChange({volume:r.value})}),t(ti(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED),r=>{this.logRemoteEvent(r),this.handleRemoteVolumeChange({muted:r.value})});let i=Jo(this.params.desiredState.playbackState.stateChangeStarted$,this.params.desiredState.seekState.stateChangeEnded$,this.videoState.stateChangeEnded$,sd(["init"])).pipe(Go(0));t(i,this.syncPlayback)}restoreSession(e){this.log({message:"restoreSession"});let{remotePlayer:t}=this.params.connection;if(e.playerState!==chrome.cast.media.PlayerState.IDLE){t.isPaused?(this.videoState.setState("paused"),w(this.params.desiredState.playbackState,"paused")):(this.videoState.setState("playing"),w(this.params.desiredState.playbackState,"playing"));let 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:"none"})}}prepare(){let e=this.params.format;this.log({message:`[prepare] format: ${e}`});let t=this.createMediaInfo(e),i=this.createLoadRequest(t);this.loadMedia(i)}handleRemotePause(){let e=this.videoState.getState();(this.videoState.getTransition()?.to==="paused"||e==="playing")&&(this.videoState.setState("paused"),w(this.params.desiredState.playbackState,"paused"))}handleRemotePlay(){let e=this.videoState.getState();(this.videoState.getTransition()?.to==="playing"||e==="paused")&&(this.videoState.setState("playing"),w(this.params.desiredState.playbackState,"playing"))}handleRemoteReady(){this.videoState.getTransition()?.to==="ready"&&this.videoState.setState("ready"),this.params.desiredState.playbackState.getTransition()?.to==="ready"&&w(this.params.desiredState.playbackState,"ready")}handleRemoteStop(){this.videoState.getState()!=="stopped"&&this.videoState.setState("stopped")}handleRemoteVolumeChange(e){let 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();let{remotePlayer:t,remotePlayerController:i}=this.params.connection;t.currentTime=e,i.seek()}stop(){let{remotePlayerController:e}=this.params.connection;e.stop()}createMediaInfo(e){let t=this.params.source,i,r,s;switch(e){case"MPEG":{let l=t[e];ei(l);let d=od(Object.keys(l));ei(d);let p=l[d];ei(p),i=p,r="video/mp4",s=chrome.cast.media.StreamType.BUFFERED;break}case"HLS":case"HLS_ONDEMAND":{let l=t[e];ei(l),i=l.url,r="application/x-mpegurl",s=chrome.cast.media.StreamType.BUFFERED;break}case"DASH_SEP":case"DASH_ONDEMAND":case"DASH_WEBM":case"DASH_WEBM_AV1":case"DASH_STREAMS":{let l=t[e];ei(l),i=l.url,r="application/dash+xml",s=chrome.cast.media.StreamType.BUFFERED;break}case"DASH_LIVE_CMAF":{let l=t[e];ei(l),i=l.url,r="application/dash+xml",s=chrome.cast.media.StreamType.LIVE;break}case"HLS_LIVE":case"HLS_LIVE_CMAF":{let l=t[e];ei(l),i=pe(l.url),r="application/x-mpegurl",s=chrome.cast.media.StreamType.LIVE;break}case"DASH_LIVE":case"WEB_RTC_LIVE":{let l="Unsupported format for Chromecast",d=new Error(l);throw this.params.output.error$.next({id:"ChromecastProvider.createMediaInfo()",category:Yo.VIDEO_PIPELINE,message:l,thrown:d}),d}case"DASH":case"DASH_LIVE_WEBM":throw new Error(`${e} is no longer supported`);default:return mi(e)}let a=new chrome.cast.media.MediaInfo(this.params.meta.videoId??i,r);a.contentUrl=i,a.streamType=s,a.metadata=new chrome.cast.media.GenericMediaMetadata;let{title:o,subtitle:u}=this.params.meta;return Ko(o)&&(a.metadata.title=o),Ko(u)&&(a.metadata.subtitle=u),a}createLoadRequest(e){let t=new chrome.cast.media.LoadRequest(e);t.autoplay=!1;let i=this.params.desiredState.seekState.getState();return i.state==="applying"||i.state==="requested"?t.currentTime=this.params.output.isLive$.getValue()?0:i.position/1e3:t.currentTime=0,t}loadMedia(e){let t=this.params.connection.session.loadMedia(e),i=new Promise((r,s)=>{this.loadMediaTimeoutSubscription.add(nd(Zo).subscribe(()=>s(`timeout(${Zo})`)))});Promise.race([t,i]).then(()=>{this.log({message:`[loadMedia] completed, format: ${this.params.format}`}),this.params.desiredState.seekState.getState().state==="applying"&&this.params.output.seekedEvent$.next(),this.handleRemoteReady()},r=>{let s=`[prepare] loadMedia failed, format: ${this.params.format}, reason: ${r}`;this.log({message:s}),this.params.output.error$.next({id:"ChromecastProvider.loadMedia",category:Yo.VIDEO_PIPELINE,message:s,thrown:r})}).finally(()=>{this.loadMediaTimeoutSubscription.unsubscribe()})}logRemoteEvent(e){this.log({message:`[remoteEvent] ${JSON.stringify(e)}`})}};import{clearVideoElement as tu}from"@vkontakte/videoplayer-shared/evergreen";import{clearVideoElement as dd}from"@vkontakte/videoplayer-shared/evergreen";var eu=n=>{try{n.pause(),n.playbackRate=0,dd(n),n.remove()}catch(e){console.error(e)}};import{fromEvent as pd,Subscription as hd}from"@vkontakte/videoplayer-shared/evergreen";var dn=class{constructor(){this.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)}},pn=window.WeakMap?new WeakMap:new dn,hn=window.WeakMap?new WeakMap:new Map,md=(n,e=20)=>{let t=0;return pd(n,"ratechange").subscribe(i=>{t++,t>=e&&(n.currentTime=n.currentTime,t=0)})},ke=(n,{audioVideoSyncRate:e,disableYandexPiP:t})=>{let i=n.querySelector("video"),r=!!i;i?tu(i):(i=document.createElement("video"),n.appendChild(i)),pn.set(i,r);let s=new hd;return s.add(md(i,e)),hn.set(i,s),i.setAttribute("crossorigin","anonymous"),i.setAttribute("playsinline","playsinline"),t&&i.setAttribute("x-yandex-pip","false"),i.controls=!1,i.setAttribute("poster","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII="),i},Ae=n=>{hn.get(n)?.unsubscribe(),hn.delete(n);let t=pn.get(n);pn.delete(n),t?tu(n):eu(n)};import{assertNonNullable as ji,isNonNullable as mt,isNullable as gd,fromEvent as fi,merge as iu,observableFrom as ru,filterChanged as su,map as zi,Subject as au,Subscription as Sd,ValueSubject as vd,ErrorCategory as yd}from"@vkontakte/videoplayer-shared/evergreen";import{isNonNullable as mn,isNullable as fd,Subscription as bd}from"@vkontakte/videoplayer-shared/evergreen";var Cs=(n,e,t,{equal:i=(a,o)=>a===o,changed$:r,onError:s}={})=>{let a=n.getState(),o=e(),u=fd(r),l=new bd;return r&&l.add(r.subscribe(d=>{let p=n.getState();i(d,p)&&n.setState(d)},s)),i(o,a)||(t(a),u&&n.setState(a)),l.add(n.stateChangeStarted$.subscribe(d=>{t(d.to),u&&n.setState(d.to)},s)),l},rt=(n,e,t)=>Cs(e,()=>n.loop,i=>{mn(i)&&(n.loop=i)},{onError:t}),we=(n,e,t,i)=>Cs(e,()=>({muted:n.muted,volume:n.volume}),r=>{mn(r)&&(n.muted=r.muted,n.volume=r.volume)},{equal:(r,s)=>r===s||r?.muted===s?.muted&&r?.volume===s?.volume,changed$:t,onError:i}),He=(n,e,t,i)=>Cs(e,()=>n.playbackRate,r=>{mn(r)&&(n.playbackRate=r)},{changed$:t,onError:i}),_t=Cs;var Td=n=>["__",n.language,n.label].join("|"),Id=(n,e)=>{if(n.id===e)return!0;let[t,i,r]=e.split("|");return n.language===i&&n.label===r},fn=class n{constructor(e){this.available$=new au;this.current$=new vd(void 0);this.error$=new au;this.subscription=new Sd;this.externalTracks=new Map;this.internalTracks=new Map;this.baseURL=e}connect(e,t,i){this.video=e,this.cueSettings=t.textTrackCuesSettings,this.subscribe();let r=s=>{this.error$.next({id:"TextTracksManager",category:yd.WTF,message:"Generic HtmlVideoTextTrackManager error",thrown:s})};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(_t(t.internalTextTracks,()=>Object.values(this.internalTracks),s=>{mt(s)&&this.setInternal(s)},{equal:(s,a)=>mt(s)&&mt(a)&&s.length===a.length&&s.every(({id:o},u)=>o===a[u].id),changed$:this.available$.pipe(zi(s=>s.filter(({type:a})=>a==="internal"))),onError:r})),this.subscription.add(_t(t.externalTextTracks,()=>Object.values(this.externalTracks),s=>{mt(s)&&this.setExternal(s)},{equal:(s,a)=>mt(s)&&mt(a)&&s.length===a.length&&s.every(({id:o},u)=>o===a[u].id),changed$:this.available$.pipe(zi(s=>s.filter(({type:a})=>a==="external"))),onError:r})),this.subscription.add(_t(t.currentTextTrack,()=>{if(this.video)return;let s=this.htmlTextTracksAsArray().find(({mode:a})=>a==="showing");return s&&this.htmlTextTrackToITextTrack(s).id},s=>this.select(s),{changed$:this.current$,onError:r})),this.subscription.add(_t(t.textTrackCuesSettings,()=>({}),()=>{if(this.video)for(let s of this.htmlTextTracksAsArray())this.applyCueSettings(s.cues),this.applyCueSettings(s.activeCues)}))}subscribe(){ji(this.video);let{textTracks:e}=this.video;this.subscription.add(fi(e,"addtrack").subscribe(()=>{let i=this.current$.getValue();i&&this.select(i)})),this.subscription.add(iu(fi(e,"addtrack"),fi(e,"removetrack"),ru(["init"])).pipe(zi(()=>this.htmlTextTracksAsArray().map(i=>this.htmlTextTrackToITextTrack(i))),su((i,r)=>i.length===r.length&&i.every(({id:s},a)=>s===r[a].id))).subscribe(this.available$)),this.subscription.add(iu(fi(e,"change"),ru(["init"])).pipe(zi(()=>this.htmlTextTracksAsArray().find(({mode:i})=>i==="showing")),zi(i=>i&&this.htmlTextTrackToITextTrack(i).id),su()).subscribe(this.current$));let t=i=>this.applyCueSettings(i.target?.activeCues??null);this.subscription.add(fi(e,"addtrack").subscribe(i=>{i.track?.addEventListener("cuechange",t);let r=s=>{let a=s.target?.cues??null;a&&a.length&&(this.applyCueSettings(s.target?.cues??null),s.target?.removeEventListener("cuechange",r))};i.track?.addEventListener("cuechange",r)})),this.subscription.add(fi(e,"removetrack").subscribe(i=>{i.track?.removeEventListener("cuechange",t)}))}applyCueSettings(e){if(!e||!e.length)return;let t=this.cueSettings.getState();for(let i of Array.from(e)){let r=i;mt(t.align)&&(r.align=t.align),mt(t.position)&&(r.position=t.position),mt(t.size)&&(r.size=t.size),mt(t.line)&&(r.line=t.line)}}htmlTextTracksAsArray(e=!1){ji(this.video);let t=[...this.video.textTracks];return e?t:t.filter(n.isHealthyTrack)}htmlTextTrackToITextTrack(e){let{language:t,label:i}=e,r=e.id?e.id:Td(e),s=this.externalTracks.has(r),a=(s?this.externalTracks.get(r)?.isAuto:this.internalTracks.get(r)?.isAuto)??r.includes("auto");return s?{id:r,type:"external",isAuto:a,language:t,label:i,url:this.externalTracks.get(r)?.url}:{id:r,type:"internal",isAuto:a,language:t,label:i,url:this.internalTracks.get(r)?.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){let t=[...this.externalTracks];e.filter(({id:i,language:r,isAuto:s})=>!this.internalTracks.has(i)&&!t.some(([,a])=>a.language===r&&a.isAuto===s)).forEach(i=>this.attach(i)),Array.from(this.internalTracks).filter(([i])=>!e.find(r=>r.id===i)).forEach(([,i])=>this.detach(i))}select(e){ji(this.video);for(let t of this.htmlTextTracksAsArray(!0))t.mode="showing";for(let t of this.htmlTextTracksAsArray(!0))(gd(e)||!Id(t,e))&&(t.mode="disabled")}destroy(){if(this.subscription.unsubscribe(),this.video)for(let e of Array.from(this.video.getElementsByTagName("track"))){let t=e.getAttribute("id");t&&this.externalTracks.has(t)&&this.video.removeChild(e)}this.externalTracks.clear()}attach(e){ji(this.video);let t=document.createElement("track");this.baseURL?t.setAttribute("src",new URL(e.url,this.baseURL).toString()):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){ji(this.video);let 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)}},je=fn;var ii=class{constructor(){this.pausedTime=0;this.streamOffset=0;this.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()}};var nu=n=>{let e=n;for(;!(e instanceof Document)&&!(e instanceof ShadowRoot)&&e!==null;)e=e?.parentNode;return e??void 0},bn=n=>{let e=nu(n);return!!(e&&e.fullscreenElement&&e.fullscreenElement===n)},ou=n=>{let e=nu(n);return!!(e&&e.pictureInPictureElement&&e.pictureInPictureElement===n)};import{fromEvent as Oe,map as At,merge as js,filterChanged as $d,isNonNullable as mu,Subject as Bd,filter as Sn,mapTo as vn,combine as fu,once as Rd,throttle as Dd,ErrorCategory as Vd,ValueSubject as bu,Subscription as Cd}from"@vkontakte/videoplayer-shared/evergreen";var xd=3,uu=(n,e,t=xd)=>{let i=0,r=0;for(let s=0;s<n.length;s++){let a=n.start(s),o=n.end(s);if(a<=e&&e<=o){if(i=a,r=o,!t)return{from:i,to:r};for(let u=s-1;u>=0;u--)n.end(u)+t>=i&&(i=n.start(u));for(let u=s+1;u<n.length;u++)n.start(u)-t<=r&&(r=n.end(u))}}return{from:i,to:r}};var Os=class{get current(){return this._current}get isYandex(){return this.current==="Yandex"}get isSafari(){return this.current==="Safari"}get isSamsungBrowser(){return this.current==="SamsungBrowser"}get safariVersion(){return this._safariVersion}detect(){let{userAgent:e}=navigator;try{let t=/yabrowser/i.test(e)?"Yandex":void 0,i=/samsungbrowser/i.test(e)?"SamsungBrowser":void 0,r=/chrome|crios/i.test(e)?"Chrome":void 0,s=/chromium/i.test(e)?"Chromium":void 0,a=/firefox|fxios/i.test(e)?"Firefox":void 0,o=/webkit|safari|khtml/i.test(e)?"Safari":void 0,u=/opr\//i.test(e)?"Opera":void 0,l=/edg/i.test(e)?"Edge":void 0;this._current=t||i||a||u||l||r||s||o||"Rest"}catch(t){console.error(t)}this.isSafari&&this.detectSafariVersion()}detectSafariVersion(){try{let{userAgent:e}=window.navigator,t=e.match(/Version\/(\d+)/);if(!t)return;let i=t[1],r=parseInt(i,10);if(isNaN(r))return;this._safariVersion=r}catch(e){console.error(e)}}};var Qi=()=>/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(navigator.appVersion??navigator.userAgent)||navigator?.userAgentData?.mobile;var Fs=class{constructor(e){this._highEntropyValues={};this._displayChecker=e}get current(){return this._current}get isIOS(){let e=["iPhone","iPad","iPod"];return this._highEntropyValues.platform==="iOS"||e.includes(this.current)}get isMac(){return this._highEntropyValues.platform==="macOS"||this.current==="Mac"}get isApple(){return this.isIOS||this.isMac}get isIphoneOrOldIpad(){if(!this.isApple||!this._displayChecker.isTouch)return!1;let e=this.current==="iPad"||this._displayChecker.width>700,t=this._iosVersion;return!e||e&&!!t&&t<16}get isAndroid(){return this._highEntropyValues.platform==="Android"||this.current==="Android"}get isMobile(){return this._highEntropyValues.mobile||this._isMobile}get iOSVersion(){return this._iosVersion}detect(){let{userAgent:e}=navigator;try{this._isMobile=Qi()}catch(t){console.error(t)}this.detectDevice(e),this.detectHighEntropyValues(),this.isIOS&&this.detectIOSVersion()}async detectHighEntropyValues(){let{userAgentData:e}=navigator;if(e?.getHighEntropyValues){let t=await e.getHighEntropyValues(["architecture","bitness","brands","mobile","platform","formFactor","model","platformVersion","wow64"]);this._highEntropyValues=t}}detectDevice(e){try{let t=/android/i.test(e)?"Android":void 0,i=/iphone/i.test(e)?"iPhone":void 0,r=/ipad/i.test(e)?"iPad":void 0,s=/ipod/i.test(e)?"iPod":void 0,a=/mac/i.test(e)?"Mac":void 0,o=/webOS|BlackBerry|IEMobile|Opera Mini/i.test(e)?"RestMobile":void 0;this._current=t||i||r||s||o||a||"Desktop"}catch(t){console.error(t)}}detectIOSVersion(){try{if(this._highEntropyValues.platformVersion){let s=this._highEntropyValues.platformVersion.split(".").slice(0,2).join("."),a=parseFloat(s);this._iosVersion=a;return}let{userAgent:e}=window.navigator,t=e.match(/OS (\d+(_\d+)?)/i);if(!t)return;let i=t[1].replace(/_/g,".");if(!i)return;let r=parseFloat(i);if(isNaN(r))return;this._iosVersion=r}catch(e){console.error(e)}}};var Ns=class{get isTouch(){return typeof this._maxTouchPoints=="number"?this._maxTouchPoints>1:"ontouchstart"in window}get maxTouchPoints(){return this._maxTouchPoints}get height(){return this._height}get width(){return this._width}get screenHeight(){return this._screenHeight}get screenWidth(){return this._screenWidth}get pixelRatio(){return this._pixelRatio}get isHDR(){return this._isHdr}get colorDepth(){return this._colorDepth}detect(){let{maxTouchPoints:e}=navigator;try{this._maxTouchPoints=e??0,this._isHdr=!!matchMedia("(dynamic-range: high)")?.matches,this._colorDepth=screen.colorDepth}catch(t){console.error(t)}try{this._pixelRatio=window.devicePixelRatio||1,this._height=screen.height,this._width=screen.width,this._height=screen.height,this._screenHeight=this._height*this._pixelRatio,this._screenWidth=this._width*this._pixelRatio}catch(t){console.error(t)}}};var tt=()=>window.ManagedMediaSource||window.MediaSource,bi=()=>!!(window.ManagedMediaSource&&window.ManagedSourceBuffer?.prototype?.appendBuffer),lu=()=>!!(window.MediaSource&&window.SourceBuffer?.prototype?.appendBuffer),_s=()=>window.ManagedMediaSource?new ManagedMediaSource:new MediaSource;var Ed=document.createElement("video"),kd='video/mp4; codecs="avc1.42000a,mp4a.40.2"',Ad='video/mp4; codecs="hev1.1.6.L93.B0"',cu='video/webm; codecs="vp09.00.10.08"',du='video/webm; codecs="av01.0.00M.08"',wd='audio/mp4; codecs="mp4a.40.2"',Pd='audio/webm; codecs="opus"',pu,Ld=async()=>{if(!window.navigator.mediaCapabilities)return;let n={type:"media-source",video:{contentType:"video/webm",width:1280,height:720,bitrate:1e6,framerate:30}},[e,t]=await Promise.all([window.navigator.mediaCapabilities.decodingInfo({...n,video:{...n.video,contentType:du}}),window.navigator.mediaCapabilities.decodingInfo({...n,video:{...n.video,contentType:cu}})]);pu={DASH_WEBM_AV1:e,DASH_WEBM:t}};Ld().catch(n=>{console.log(Ed),console.error(n)});var Us=class{constructor(e,t){this._deviceChecker=e,this._browserChecker=t}get protocols(){return this._protocols}get containers(){return this._containers}get codecs(){return this._codecs}get webmDecodingInfo(){return pu}get supportedCodecs(){return Object.keys(this._codecs).filter(e=>this._codecs[e])}get nativeHlsSupported(){return this._nativeHlsSupported}detect(){this._video=document.createElement("video");try{this._protocols={mms:bi(),mse:lu(),hls:!!(this._video.canPlayType?.("application/x-mpegurl")||this._video.canPlayType?.("vnd.apple.mpegURL")),webrtc:!!window.RTCPeerConnection,ws:!!window.WebSocket},this._containers={mp4:!!this._video.canPlayType?.("video/mp4"),webm:!!this._video.canPlayType?.("video/webm"),cmaf:!0};let e=!!tt()?.isTypeSupported?.(kd),t=!!tt()?.isTypeSupported?.(Ad),i=!!tt()?.isTypeSupported?.(wd);this._codecs={h264:e,h265:t,vp9:!!tt()?.isTypeSupported?.(cu),av1:!!tt()?.isTypeSupported?.(du),aac:i,opus:!!tt()?.isTypeSupported?.(Pd),mpeg:(e||t)&&i},this._nativeHlsSupported=this._protocols.hls&&this._containers.mp4}catch(e){console.error(e)}this.destroyVideoElement()}destroyVideoElement(){if(!this._video)return;try{this._video.pause(),this._video.currentTime=0,this._video.removeAttribute("src"),this._video.src="",this._video.load()}catch(t){console.error(t)}if(this._video.remove){this._video.remove(),this._video=null;return}this._video.parentNode&&this._video.parentNode.removeChild(this._video);let e=this._video.cloneNode(!1);this._video.parentNode?.replaceChild(e,this._video),this._video=null}};var hu="audio/mpeg",Hs=class{supportMp3(){return this._codecs.mp3&&this._containers.mpeg}detect(){this._audio=document.createElement("audio");try{this._containers={mpeg:!!this._audio.canPlayType?.(hu)},this._codecs={mp3:!!tt()?.isTypeSupported?.(hu)}}catch(e){console.error(e)}this.destroyAudioElement()}destroyAudioElement(){if(!this._audio)return;try{this._audio.pause(),this._audio.currentTime=0,this._audio.removeAttribute("src"),this._audio.src="",this._audio.load()}catch(t){console.error(t)}if(this._audio.remove){this._audio.remove(),this._audio=null;return}this._audio.parentNode&&this._audio.parentNode.removeChild(this._audio);let e=this._audio.cloneNode(!1);this._audio.parentNode?.replaceChild(e,this._audio),this._audio=null}};import{ValueSubject as Md}from"@vkontakte/videoplayer-shared/evergreen";var gn=class{constructor(){this.isInited$=new Md(!1);this._displayChecker=new Ns,this._deviceChecker=new Fs(this._displayChecker),this._browserChecker=new Os,this._videoChecker=new Us(this._deviceChecker,this._browserChecker),this._audioChecker=new Hs,this.detect()}get display(){return this._displayChecker}get device(){return this._deviceChecker}get browser(){return this._browserChecker}get video(){return this._videoChecker}get audio(){return this._audioChecker}async detect(){this._displayChecker.detect(),this._deviceChecker.detect(),this._browserChecker.detect(),this._videoChecker.detect(),this._audioChecker.detect(),this.isInited$.next(!0)}},C=new gn;var Pe=n=>{let e=b=>Oe(n,b).pipe(vn(void 0)),t=new Cd,i=()=>t.unsubscribe(),r=js(Oe(n,"progress"),Oe(n,"timeupdate")).pipe(At(()=>uu(n.buffered,n.currentTime))),s=C.browser.isSafari?fu({play:e("play").pipe(Rd()),playing:e("playing")}).pipe(vn(void 0)):e("playing"),a=Oe(n,"volumechange").pipe(At(()=>({muted:n.muted,volume:n.volume}))),o=Oe(n,"ratechange").pipe(At(()=>n.playbackRate)),u=Oe(n,"error").pipe(Sn(()=>!!(n.error||n.played.length)),At(()=>{let b=n.error;return{id:b?`MediaError#${b.code}`:"HtmlVideoError",category:Vd.VIDEO_PIPELINE,message:b?b.message:"Error event from HTML video element",thrown:n.error??void 0}})),l=Oe(n,"timeupdate").pipe(At(()=>n.currentTime)),d=["waiting","seeking","seeked","timeupdate"],p=new Bd,c=.3,h;t.add(js(...d.map(b=>Oe(n,b))).subscribe(b=>{let R=n.currentTime;n.loop&&mu(h)&&mu(R)&&h>=n.duration-c&&R<=c&&p.next(h),h=R}));let m=e("pause").pipe(Sn(()=>!n.error&&h!==n.duration)),f=Oe(n,"enterpictureinpicture"),g=Oe(n,"leavepictureinpicture"),S=new bu(ou(n));t.add(f.subscribe(()=>S.next(!0))),t.add(g.subscribe(()=>S.next(!1)));let k=new bu(bn(n)),v=Oe(n,"fullscreenchange");t.add(v.pipe(At(()=>bn(n))).subscribe(k));let I=.1,x=1e3,M=Oe(n,"timeupdate").pipe(At(b=>n.duration-n.currentTime<I)),V=js(M.pipe(Sn(b=>!n.loop&&b)),Oe(n,"ended")).pipe(Dd(x),vn(void 0)),A=fu({latestNativeEvent:js(...["waiting","pause","canplay","play","canplaythrough","playing","seeking","seeked","ended"].map(b=>Oe(n,b))),endedExpected:M}).pipe(At(({endedExpected:b})=>b?n.readyState<2:n.readyState<3),$d());return{playing$:s,pause$:m,canplay$:e("canplay"),ended$:V,looped$:p,error$:u,seeked$:e("seeked"),seeking$:e("seeking"),progress$:e("progress"),loadStart$:e("loadstart"),loadedMetadata$:e("loadedmetadata"),loadedData$:e("loadeddata"),timeUpdate$:l,durationChange$:Oe(n,"durationchange").pipe(At(()=>n.duration)),isBuffering$:A,currentBuffer$:r,volumeState$:a,playbackRateState$:o,inPiP$:S,inFullscreen$:k,enterPip$:f,leavePip$:g,destroy:i}};import{VideoQuality as Ut}from"@vkontakte/videoplayer-shared/evergreen";var ft=n=>{switch(n){case"mobile":return Ut.Q_144P;case"lowest":return Ut.Q_240P;case"low":return Ut.Q_360P;case"sd":case"medium":return Ut.Q_480P;case"hd":case"high":return Ut.Q_720P;case"fullhd":case"full":return Ut.Q_1080P;case"quadhd":case"quad":return Ut.Q_1440P;case"ultrahd":case"ultra":return Ut.Q_2160P}};import{isNonNullable as Y,isNullable as Gs,now as Au,isHigher as Ys,isHigherOrEqual as Si,isInvariantQuality as Ks,isLowerOrEqual as vi,videoSizeToQuality as wu,assertNotEmptyArray as Xs,assertNonNullable as Pu}from"@vkontakte/videoplayer-shared/evergreen";var yn=!1,wt={},gu=n=>{yn=n},Su=()=>{wt={}},vu=n=>{n(wt)},Wi=(n,e)=>{yn&&(wt.meta=wt.meta??{},wt.meta[n]=e)},Fe=class{constructor(e){this.name=e}next(e){if(!yn)return;wt.series=wt.series??{};let t=wt.series[this.name]??[];t.push([Date.now(),e]),wt.series[this.name]=t}};import{isHigher as Od,isHigherOrEqual as Kg,isLower as yu,isLowerOrEqual as Xg,isNonNullable as zs,isNullable as Fd,videoHeightToQuality as Qs}from"@vkontakte/videoplayer-shared/evergreen";function Tn(n,e,t){return!n.max&&n.min===e?"high_quality":!n.min&&n.max===t?"traffic_saving":"unknown"}function Ws(n,e,t){return!!n&&Tn(n,e,t)==="high_quality"}function gi(n,e,t){return Fd(n)||zs(n.min)&&zs(n.max)&&yu(n.max,n.min)||zs(n.min)&&e&&Od(n.min,e)||zs(n.max)&&t&&yu(n.max,t)}function Tu({limits:n,highestAvailableHeight:e,lowestAvailableHeight:t}){return gi({max:n?.max?Qs(n.max):void 0,min:n?.min?Qs(n.min):void 0},e?Qs(e):void 0,t?Qs(t):void 0)}var Lu=new Fe("best_bitrate"),Js=(n,e,t)=>(e-t)*Math.pow(2,-10*n)+t;var yi=n=>(e,t)=>n*(Number(e.bitrate)-Number(t.bitrate)),Ht=class{constructor(){this.history={}}recordSelection(e){this.history[e.id]=Au()}recordSwitch(e){this.last=e}clear(){this.last=void 0,this.history={}}},Zs='Assertion "ABR Tracks is empty array" failed',qs=new WeakMap,Iu=new WeakMap,xu=new WeakMap,qi=(n,e,t,i)=>{let r=[...e].sort(yi(1)),s=[...t].sort(yi(1)),a=s.filter(u=>Y(u.bitrate)&&Y(n.bitrate)?n.bitrate/u.bitrate>i:!0),o=s.at(Math.round(s.length*r.indexOf(n)/(r.length+1)))??s.at(-1);return o&&a.includes(o)?o:a.length?a.at(-1):s.at(0)},Gi=(n,e,t,i)=>{let r=qs.get(e);r||(r=[...e].sort(yi(1)),qs.set(e,r));let s=qs.get(t);s||(s=[...t].sort(yi(1)),qs.set(t,s));let a=xu.get(n);a||(a=s.filter(u=>Y(u.bitrate)&&Y(n.bitrate)?n.bitrate/u.bitrate>i:!0),xu.set(n,a));let o=s.at(Math.round(s.length*r.indexOf(n)/(r.length+1)))??s.at(-1);return o&&a.includes(o)?o:a.length?a.at(-1):s.at(0)},Eu=n=>"quality"in n,ea=(n,e,t,i)=>{let r=Y(i?.last?.bitrate)&&Y(t?.bitrate)&&i.last.bitrate<t.bitrate?n.trackCooldownIncreaseQuality:n.trackCooldownDecreaseQuality,s=t&&i&&i.history[t.id]&&Au()-i.history[t.id]<=r&&(!i.last||t.id!==i.last.id);if(t?.id&&i&&!s&&i.recordSelection(t),s&&i?.last){let a=i.last;i?.recordSwitch(a);let o=Eu(a)?"video":"audio",u=Eu(a)?a.quality:a.bitrate;return e({message:`
7
7
  [last ${o} selected] ${u}
8
8
  `}),a}return i?.recordSwitch(t),t},Nd=(n,e)=>Math.log(e)/Math.log(n),Mu=({tuning:n,container:e,limits:t,panelSize:i})=>{let r=n.containerSizeFactor;if(i)return{containerSizeLimit:i,containerSizeFactor:r};if(n.usePixelRatio&&C.display.pixelRatio){let s=C.display.pixelRatio;if(n.pixelRatioMultiplier)r*=n.pixelRatioMultiplier*(s-1)+1;else{let a=n.pixelRatioLogBase,[o=0,u=0,l=0]=n.pixelRatioLogCoefficients,d=Nd(a,o*s+u)+l;Number.isFinite(d)&&(r*=d)}}return Ws(t,n.highQualityLimit,n.trafficSavingLimit)&&(r*=2),{containerSizeLimit:n.limitByContainer&&e&&e.width>0&&e.height>0?{width:e.width*r,height:e.height*r}:void 0,containerSizeFactor:r}},ku=new WeakMap,bt=(n,{container:e,estimatedThroughput:t,tuning:i,limits:r,reserve:s=0,forwardBufferHealth:a,playbackRate:o,current:u,history:l,visible:d,droppedVideoMaxQualityLimit:p,stallsVideoMaxQualityLimit:c,stallsPredictedThroughput:h,abrLogger:m,panelSize:f})=>{Xs(n,Zs);let{containerSizeFactor:g,containerSizeLimit:S}=Mu({container:e,tuning:i,limits:r,panelSize:f}),k=i.considerPlaybackRate&&Y(o)?o:1,v=ku.get(n);v||(v=n.filter(T=>!Ks(T.quality)).sort((T,P)=>Ys(T.quality,P.quality)?-1:1),ku.set(n,v));let I=v.at(-1)?.quality,x=v.at(0)?.quality,M=gi(r,x,I),V=k*Js(a??.5,i.bitrateFactorAtEmptyBuffer,i.bitrateFactorAtFullBuffer),E={},A=null;for(let T of v){let P=!0;if(S)if(T.size)P=T.size.width<=S.width&&T.size.height<=S.height;else{let L=S&&wu(S);P=L?vi(T.quality,L):!0}if(!P){E[T.quality]="FitsContainer";continue}let ee=h||t,B=Y(ee)&&isFinite(ee)&&Y(T.bitrate)?ee-s>=T.bitrate*V:!0,_=Ws(r,i.highQualityLimit,i.trafficSavingLimit)&&r?.min===T.quality;if(!B&&!_){E[T.quality]="FitsThroughput";continue}if(i.lazyQualitySwitch&&Y(i.minBufferToSwitchUp)&&u&&!Ks(u.quality)&&(a??0)<i.minBufferToSwitchUp&&Ys(T.quality,u.quality)){E[T.quality]="Buffer";continue}if(!!p&&Si(T.quality,p)&&!_){E[T.quality]="DroppedFramesLimit";continue}if(!!c&&Si(T.quality,c)&&!_){E[T.quality]="StallsLimit";continue}let se=M||(Gs(r?.max)||vi(T.quality,r.max))&&(Gs(r?.min)||Si(T.quality,r.min)),X=Y(d)&&!d?vi(T.quality,i.backgroundVideoQualityLimit):!0;if(!se||!X){E[T.quality]="FitsQualityLimits";continue}A||(A=T)}A&&A.bitrate&&Lu.next(A.bitrate);let b=A??v.at(-1)??n[0],R=l?.last,y=ea(i,m,b,l);return Y(l)&&y.quality!==R?.quality&&m({message:`
9
9
  [VIDEO TRACKS ABR]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vkontakte/videoplayer-core",
3
- "version": "2.0.132-dev.a4a5e7bd.0",
3
+ "version": "2.0.132-dev.bc968375.0",
4
4
  "author": "vk.com",
5
5
  "description": "Videoplayer core library based on the vk.com platform",
6
6
  "homepage": "https://vk.com",
@@ -54,7 +54,7 @@
54
54
  "**/*.d.ts"
55
55
  ],
56
56
  "dependencies": {
57
- "@vkontakte/videoplayer-shared": "1.0.60-dev.17d39930.0",
57
+ "@vkontakte/videoplayer-shared": "1.0.60-dev.9de761ce.0",
58
58
  "hls.js": "~1.4.7"
59
59
  }
60
60
  }