@vkontakte/videoplayer-core 2.0.135-dev.460bdb40.0 → 2.0.135-dev.7c676fc4.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.135-dev.460bdb40.0
3
- * Mon, 30 Jun 2025 13:54:44 GMT
2
+ * @vkontakte/videoplayer-core v2.0.135-dev.7c676fc4.0
3
+ * Tue, 01 Jul 2025 13:42:14 GMT
4
4
  * https://st.mycdn.me/static/vkontakte-videoplayer/2-0-135/doc/
5
5
  */
6
- var Oo="2.0.135-dev.460bdb40.0";var Ce=(r=>(r.STOPPED="stopped",r.READY="ready",r.PLAYING="playing",r.PAUSED="paused",r))(Ce||{}),Et=(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))(Et||{});var As=(r=>(r.NOT_AVAILABLE="NOT_AVAILABLE",r.AVAILABLE="AVAILABLE",r.CONNECTING="CONNECTING",r.CONNECTED="CONNECTED",r))(As||{}),tn=(i=>(i.HTTP1="http1",i.HTTP2="http2",i.QUIC="quic",i))(tn||{});var rn=(a=>(a.NONE="none",a.INLINE="inline",a.FULLSCREEN="fullscreen",a.SECOND_SCREEN="second_screen",a.PIP="pip",a.INVISIBLE="invisible",a))(rn||{}),Ps=(i=>(i.TRAFFIC_SAVING="traffic_saving",i.HIGH_QUALITY="high_quality",i.UNKNOWN="unknown",i))(Ps||{});import{assertNever as jo,assertNonNullable as qc,isNonNullable as Ms,ValueSubject as sn,Subject as Gc,Subscription as Yc,merge as Kc,observableFrom as Xc,fromEvent as _o,map as No,tap as Uo,filterChanged as Jc,isNullable as an,ErrorCategory as Ho}from"@vkontakte/videoplayer-shared/evergreen";var Fo=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 Ls=class{constructor(e){this.connection$=new sn(void 0);this.castState$=new sn("NOT_AVAILABLE");this.errorEvent$=new Gc;this.realCastState$=new sn("NOT_AVAILABLE");this.subscription=new Yc;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=Ms(window.chrome?.cast),r=!!window.__onGCastApiAvailable;i?this.initializeCastApi():(window.__onGCastApiAvailable=s=>{delete window.__onGCastApiAvailable,s&&!this.isDestroyed&&this.initializeCastApi()},r||Fo("https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1").catch(()=>this.errorEvent$.next({id:"ChromecastLoading",category:Ho.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(){Ms(this.connection$.getValue())?this.disconnect():this.connect()}setVolume(e){let t=this.connection$.getValue();an(t)||(t.remotePlayer.volumeLevel=e,t.remotePlayerController.setVolumeLevel())}setMuted(e){let t=this.connection$.getValue();an(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 jo(r.sessionState)}})).add(Kc(_o(i,cast.framework.CastContextEventType.CAST_STATE_CHANGED).pipe(Uo(r=>{this.log({message:`[cast.framework.RemotePlayerEventType.CAST_STATE_CHANGED]: ${JSON.stringify(r)}`})}),No(r=>r.castState)),Xc([i.getCastState()])).pipe(Jc(),No(Zc),Uo(r=>{this.log({message:`realCastState$: ${r}`})})).subscribe(this.realCastState$)).add(this.realCastState$.subscribe(r=>{let s=r==="CONNECTED",a=Ms(this.connection$.getValue());if(s&&!a){let o=i.getCurrentSession();qc(o);let u=o.getCastDevice(),l=o.getMediaSession()?.media?.contentId;(an(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"?Ms(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:Ho.EXTERNAL_API,message:"[initializeCastApi] failed",thrown:r})}}},Zc=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 jo(n)}};import{assertNever as zo}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:zo(t)}return n},Ct=(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:zo(e)}};var M=(n,e,t=!1)=>{let i=n.getTransition();(t||!i||i.to===e)&&n.setState(e)};import{isNonNullable as ed,Subject as Bs,merge as Qo}from"@vkontakte/videoplayer-shared/evergreen";var _=class{constructor(e){this.transitionStarted$=new Bs;this.transitionEnded$=new Bs;this.transitionUpdated$=new Bs;this.forceChanged$=new Bs;this.stateChangeStarted$=Qo(this.transitionStarted$,this.transitionUpdated$);this.stateChangeEnded$=Qo(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||ed(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 td}from"@vkontakte/videoplayer-shared/evergreen";var Wo=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 td(n)}};import{assertNever as pi,assertNonNullable as Xt,debounce as qo,ErrorCategory as Go,fromEvent as Jt,isNonNullable as Yo,map as Ko,merge as Xo,observableFrom as id,Subject as rd,Subscription as nn,timeout as sd,getHighestQuality as ad}from"@vkontakte/videoplayer-shared/evergreen";var nd=5,od=5,ud=500,Jo=7e3,_i=class{constructor(e){this.subscription=new nn;this.loadMediaTimeoutSubscription=new nn;this.videoState=new _("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:pi(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:pi(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:pi(e)}break}default:pi(i)}}};this.params=e,this.log=this.params.dependencies.logger.createComponentLog("ChromecastProvider"),this.log({message:`constructor, format: ${e.format}`}),this.params.output.isLive$.next(Wo(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 nn;this.subscription.add(e),this.subscription.add(Xo(this.videoState.stateChangeStarted$.pipe(Ko(r=>`stateChangeStarted$ ${JSON.stringify(r)}`)),this.videoState.stateChangeEnded$.pipe(Ko(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 rd;e.add(r.pipe(qo(ud)).subscribe(()=>{this.params.output.seekedEvent$.next()}));let s=NaN;e.add(Jt(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)>nd)&&r.next(o),s=o})),e.add(Jt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.DURATION_CHANGED).subscribe(a=>{this.logRemoteEvent(a),this.params.output.duration$.next(a.value)}))}t(Jt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MEDIA_LOADED_CHANGED),r=>{this.logRemoteEvent(r),r.value?this.handleRemoteReady():(this.handleRemoteStop(),e.unsubscribe())}),t(Jt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED),r=>{this.logRemoteEvent(r),r.value?this.handleRemotePause():this.handleRemotePlay()}),t(Jt(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<od&&this.params.output.endedEvent$.next(),this.handleRemoteStop(),M(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:pi(a)}}),t(Jt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED),r=>{this.logRemoteEvent(r),this.handleRemoteVolumeChange({volume:r.value})}),t(Jt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED),r=>{this.logRemoteEvent(r),this.handleRemoteVolumeChange({muted:r.value})});let i=Xo(this.params.desiredState.playbackState.stateChangeStarted$,this.params.desiredState.seekState.stateChangeEnded$,this.videoState.stateChangeEnded$,id(["init"])).pipe(qo(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"),M(this.params.desiredState.playbackState,"paused")):(this.videoState.setState("playing"),M(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"),M(this.params.desiredState.playbackState,"paused"))}handleRemotePlay(){let e=this.videoState.getState();(this.videoState.getTransition()?.to==="playing"||e==="paused")&&(this.videoState.setState("playing"),M(this.params.desiredState.playbackState,"playing"))}handleRemoteReady(){this.videoState.getTransition()?.to==="ready"&&this.videoState.setState("ready"),this.params.desiredState.playbackState.getTransition()?.to==="ready"&&M(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];Xt(l);let p=ad(Object.keys(l));Xt(p);let c=l[p];Xt(c),i=c,r="video/mp4",s=chrome.cast.media.StreamType.BUFFERED;break}case"HLS":case"HLS_ONDEMAND":{let l=t[e];Xt(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];Xt(l),i=l.url,r="application/dash+xml",s=chrome.cast.media.StreamType.BUFFERED;break}case"DASH_LIVE_CMAF":{let l=t[e];Xt(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];Xt(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",p=new Error(l);throw this.params.output.error$.next({id:"ChromecastProvider.createMediaInfo()",category:Go.VIDEO_PIPELINE,message:l,thrown:p}),p}case"DASH":case"DASH_LIVE_WEBM":throw new Error(`${e} is no longer supported`);default:return pi(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 Yo(o)&&(a.metadata.title=o),Yo(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(sd(Jo).subscribe(()=>s(`timeout(${Jo})`)))});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:Go.VIDEO_PIPELINE,message:s,thrown:r})}).finally(()=>{this.loadMediaTimeoutSubscription.unsubscribe()})}logRemoteEvent(e){this.log({message:`[remoteEvent] ${JSON.stringify(e)}`})}};import{clearVideoElement as eu}from"@vkontakte/videoplayer-shared/evergreen";import{clearVideoElement as ld}from"@vkontakte/videoplayer-shared/evergreen";var Zo=n=>{try{n.pause(),n.playbackRate=0,ld(n),n.remove()}catch(e){console.error(e)}};import{fromEvent as cd,Subscription as dd}from"@vkontakte/videoplayer-shared/evergreen";var on=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)}},un=window.WeakMap?new WeakMap:new on,ln=window.WeakMap?new WeakMap:new Map,pd=(n,e=20)=>{let t=0;return cd(n,"ratechange").subscribe(i=>{t++,t>=e&&(n.currentTime=n.currentTime,t=0)})},Oe=(n,{audioVideoSyncRate:e,disableYandexPiP:t})=>{let i=n.querySelector("video"),r=!!i;i?eu(i):(i=document.createElement("video"),n.appendChild(i)),un.set(i,r);let s=new dd;return s.add(pd(i,e)),ln.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},Fe=n=>{ln.get(n)?.unsubscribe(),ln.delete(n);let t=un.get(n);un.delete(n),t?eu(n):Zo(n)};import{assertNonNullable as Ui,isNonNullable as pt,isNullable as fd,fromEvent as hi,merge as tu,observableFrom as iu,filterChanged as ru,map as Hi,Subject as su,Subscription as bd,ValueSubject as gd,ErrorCategory as Sd}from"@vkontakte/videoplayer-shared/evergreen";import{isNonNullable as cn,isNullable as hd,Subscription as md}from"@vkontakte/videoplayer-shared/evergreen";var $s=(n,e,t,{equal:i=(a,o)=>a===o,changed$:r,onError:s}={})=>{let a=n.getState(),o=e(),u=hd(r),l=new md;return r&&l.add(r.subscribe(p=>{let c=n.getState();i(p,c)&&n.setState(p)},s)),i(o,a)||(t(a),u&&n.setState(a)),l.add(n.stateChangeStarted$.subscribe(p=>{t(p.to),u&&n.setState(p.to)},s)),l},dt=(n,e,t)=>$s(e,()=>n.loop,i=>{cn(i)&&(n.loop=i)},{onError:t}),_e=(n,e,t,i)=>$s(e,()=>({muted:n.muted,volume:n.volume}),r=>{cn(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}),et=(n,e,t,i)=>$s(e,()=>n.playbackRate,r=>{cn(r)&&(n.playbackRate=r)},{changed$:t,onError:i}),Ni=$s;var vd=n=>["__",n.language,n.label].join("|"),yd=(n,e)=>{if(n.id===e)return!0;let[t,i,r]=e.split("|");return n.language===i&&n.label===r},dn=class n{constructor(e){this.available$=new su;this.current$=new gd(void 0);this.error$=new su;this.subscription=new bd;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:Sd.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(Ni(t.internalTextTracks,()=>Object.values(this.internalTracks),s=>{pt(s)&&this.setInternal(s)},{equal:(s,a)=>pt(s)&&pt(a)&&s.length===a.length&&s.every(({id:o},u)=>o===a[u].id),changed$:this.available$.pipe(Hi(s=>s.filter(({type:a})=>a==="internal"))),onError:r})),this.subscription.add(Ni(t.externalTextTracks,()=>Object.values(this.externalTracks),s=>{pt(s)&&this.setExternal(s)},{equal:(s,a)=>pt(s)&&pt(a)&&s.length===a.length&&s.every(({id:o},u)=>o===a[u].id),changed$:this.available$.pipe(Hi(s=>s.filter(({type:a})=>a==="external"))),onError:r})),this.subscription.add(Ni(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(Ni(t.textTrackCuesSettings,()=>({}),()=>{if(this.video)for(let s of this.htmlTextTracksAsArray())this.applyCueSettings(s.cues),this.applyCueSettings(s.activeCues)}))}subscribe(){Ui(this.video);let{textTracks:e}=this.video;this.subscription.add(hi(e,"addtrack").subscribe(()=>{let i=this.current$.getValue();i&&this.select(i)})),this.subscription.add(tu(hi(e,"addtrack"),hi(e,"removetrack"),iu(["init"])).pipe(Hi(()=>this.htmlTextTracksAsArray().map(i=>this.htmlTextTrackToITextTrack(i))),ru((i,r)=>i.length===r.length&&i.every(({id:s},a)=>s===r[a].id))).subscribe(this.available$)),this.subscription.add(tu(hi(e,"change"),iu(["init"])).pipe(Hi(()=>this.htmlTextTracksAsArray().find(({mode:i})=>i==="showing")),Hi(i=>i&&this.htmlTextTrackToITextTrack(i).id),ru()).subscribe(this.current$));let t=i=>this.applyCueSettings(i.target?.activeCues??null);this.subscription.add(hi(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(hi(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;pt(t.align)&&(r.align=t.align),pt(t.position)&&(r.position=t.position),pt(t.size)&&(r.size=t.size),pt(t.line)&&(r.line=t.line)}}htmlTextTracksAsArray(e=!1){Ui(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:vd(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){Ui(this.video);for(let t of this.htmlTextTracksAsArray(!0))t.mode="showing";for(let t of this.htmlTextTracksAsArray(!0))(fd(e)||!yd(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){Ui(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){Ui(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)}},tt=dn;var Zt=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 au=n=>{let e=n;for(;!(e instanceof Document)&&!(e instanceof ShadowRoot)&&e!==null;)e=e?.parentNode;return e??void 0},pn=n=>{let e=au(n);return!!(e&&e.fullscreenElement&&e.fullscreenElement===n)},nu=n=>{let e=au(n);return!!(e&&e.pictureInPictureElement&&e.pictureInPictureElement===n)};import{fromEvent as $e,map as ht,merge as _s,filterChanged as hu,isNonNullable as mu,Subject as Md,filter as mn,mapTo as fn,combine as Ld,once as Bd,throttle as $d,ErrorCategory as Rd,ValueSubject as fu,Subscription as Dd}from"@vkontakte/videoplayer-shared/evergreen";var Td=3,ou=(n,e,t=Td)=>{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 Rs=class{constructor(){this._isMiuiBrowser=!1}get current(){return this._current}get isChrome(){return this.current==="Chrome"}get isFirefox(){return this.current==="Firefox"}get isSafari(){return this.current==="Safari"}get isOpera(){return this.current==="Opera"}get isEdge(){return this.current==="Edge"}get isYandex(){return this.current==="Yandex"}get isSamsungBrowser(){return this.current==="SamsungBrowser"}get currentVersion(){return this._current_version}get chromeVersion(){return this._chromeVersion}get firefoxVersion(){return this._firefoxVersion}get safariVersion(){return this._safariVersion}get operaVersion(){return this._operaVersion}get edgeVersion(){return this._edgeVersion}get yandexVersion(){return this._yandexVersion}get isMiuiBrowser(){return this._isMiuiBrowser}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._isMiuiBrowser=/(XiaoMi)|(MiuiBrowser)/i.test(e),this._current=t||i||a||u||l||r||s||o||"Rest"}catch(t){console.error(t)}this.isChrome&&this.detectChromeVersion(),this.isFirefox&&this.detectFirefoxVersion(),this.isSafari&&this.detectSafariVersion(),this.isOpera&&this.detectOperaVersion(),this.isEdge&&this.detectEdgeVersion(),this.isYandex&&this.detectYandexVersion()}detectVersion(e){try{let{userAgent:t}=window.navigator,i=t.match(e);if(!i)return;let r=i[1],s=parseInt(r,10);if(!isNaN(s))return this._current_version=s,s}catch(t){console.error(t)}}detectChromeVersion(){this._chromeVersion=this.detectVersion(/Chrome\/(\d+\.\d+)/)}detectFirefoxVersion(){this._firefoxVersion=this.detectVersion(/Firefox\/(\d+\.\d+)/)}detectSafariVersion(){this._safariVersion=this.detectVersion(/Version\/(\d+)/)}detectOperaVersion(){this._operaVersion=this.detectVersion(/OPR\/(\d+\.\d+)/)}detectEdgeVersion(){this._edgeVersion=this.detectVersion(/Edg\/(\d+\.\d+)/)}detectYandexVersion(){this._yandexVersion=this.detectVersion(/YaBrowser\/(\d+\.\d+\.\d+)/)}};var ji=()=>/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(navigator.appVersion??navigator.userAgent)||navigator?.userAgentData?.mobile;var Ds=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=ji()}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 Vs=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 Je=()=>window.ManagedMediaSource||window.MediaSource,mi=()=>!!(window.ManagedMediaSource&&window.ManagedSourceBuffer?.prototype?.appendBuffer),uu=()=>!!(window.MediaSource&&window.SourceBuffer?.prototype?.appendBuffer),Cs=()=>window.ManagedMediaSource?new ManagedMediaSource:new MediaSource;var Id=document.createElement("video"),xd='video/mp4; codecs="avc1.42000a,mp4a.40.2"',Ed='video/mp4; codecs="hev1.1.6.L93.B0"',lu='video/webm; codecs="vp09.00.10.08"',cu='video/webm; codecs="av01.0.00M.08"',kd='audio/mp4; codecs="mp4a.40.2"',wd='audio/webm; codecs="opus"',du,Ad=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:cu}}),window.navigator.mediaCapabilities.decodingInfo({...n,video:{...n.video,contentType:lu}})]);du={DASH_WEBM_AV1:e,DASH_WEBM:t}};Ad().catch(n=>{console.log(Id),console.error(n)});var Os=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 du}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:mi(),mse:uu(),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=!!Je()?.isTypeSupported?.(xd),t=!!Je()?.isTypeSupported?.(Ed),i=!!Je()?.isTypeSupported?.(kd);this._codecs={h264:e,h265:t,vp9:!!Je()?.isTypeSupported?.(lu),av1:!!Je()?.isTypeSupported?.(cu),aac:i,opus:!!Je()?.isTypeSupported?.(wd),mpeg:(e||t)&&i},this._nativeHlsSupported=this._protocols.hls&&this._containers.mp4}catch(e){console.error(e)}try{this.destroyVideoElement()}catch(e){console.error("Error destroying video element:",e)}}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 pu="audio/mpeg",Fs=class{supportMp3(){return this._codecs.mp3&&this._containers.mpeg}detect(){this._audio=document.createElement("audio");try{this._containers={mpeg:!!this._audio.canPlayType?.(pu)},this._codecs={mp3:!!Je()?.isTypeSupported?.(pu)}}catch(e){console.error(e)}try{this.destroyAudioElement()}catch(e){console.error("Error destroying audio element:",e)}}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 Pd}from"@vkontakte/videoplayer-shared/evergreen";var hn=class{constructor(){this.isInited$=new Pd(!1);this._displayChecker=new Vs,this._deviceChecker=new Ds(this._displayChecker),this._browserChecker=new Rs,this._videoChecker=new Os(this._deviceChecker,this._browserChecker),this._audioChecker=new Fs,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)}},O=new hn;var Ne=n=>{let e=g=>$e(n,g).pipe(fn(void 0)),t=new Dd,i=()=>t.unsubscribe(),r=_s($e(n,"progress"),$e(n,"timeupdate")).pipe(ht(()=>ou(n.buffered,n.currentTime))),s=O.browser.isSafari?Ld({play:e("play").pipe(Bd()),playing:e("playing")}).pipe(fn(void 0)):e("playing"),a=$e(n,"volumechange").pipe(ht(()=>({muted:n.muted,volume:n.volume}))),o=$e(n,"ratechange").pipe(ht(()=>n.playbackRate)),u=$e(n,"error").pipe(mn(()=>!!(n.error||n.played.length)),ht(()=>{let g=n.error;return{id:g?`MediaError#${g.code}`:"HtmlVideoError",category:Rd.VIDEO_PIPELINE,message:g?g.message:"Error event from HTML video element",thrown:n.error??void 0}})),l=$e(n,"timeupdate").pipe(ht(()=>n.currentTime)),p=["waiting","seeking","seeked","timeupdate"],c=new Md,d=.3,h;t.add(_s(...p.map(g=>$e(n,g))).subscribe(g=>{let R=n.currentTime;n.loop&&mu(h)&&mu(R)&&h>=n.duration-d&&R<=d&&c.next(h),h=R}));let m=e("pause").pipe(mn(()=>!n.error&&h!==n.duration)),f=$e(n,"enterpictureinpicture"),b=$e(n,"leavepictureinpicture"),S=new fu(nu(n));t.add(f.subscribe(()=>S.next(!0))),t.add(b.subscribe(()=>S.next(!1)));let x=new fu(pn(n)),v=$e(n,"fullscreenchange");t.add(v.pipe(ht(()=>pn(n))).subscribe(x));let I=.1,E=1e3,L=$e(n,"timeupdate").pipe(ht(g=>n.duration-n.currentTime<I),hu()),V=_s(L.pipe(mn(g=>!n.loop&&g)),$e(n,"ended")).pipe($d(E),fn(void 0)),w=_s(...["waiting","pause","canplay","play","canplaythrough","playing","seeking","seeked","ended"].map(g=>$e(n,g)),L.pipe(ht(g=>({type:g?"ended":"unknown"})))).pipe(ht(g=>O.browser.isFirefox&&g.type==="ended"?n.readyState<2:n.readyState<3),hu());return{playing$:s,pause$:m,canplay$:e("canplay"),ended$:V,looped$:c,error$:u,seeked$:e("seeked"),seeking$:e("seeking"),progress$:e("progress"),loadStart$:e("loadstart"),loadedMetadata$:e("loadedmetadata"),loadedData$:e("loadeddata"),timeUpdate$:l,durationChange$:$e(n,"durationchange").pipe(ht(()=>n.duration)),isBuffering$:w,currentBuffer$:r,volumeState$:a,playbackRateState$:o,inPiP$:S,inFullscreen$:x,enterPip$:f,leavePip$:b,destroy:i}};import{VideoQuality as Ot}from"@vkontakte/videoplayer-shared/evergreen";var Ft=n=>{switch(n){case"mobile":return Ot.Q_144P;case"lowest":return Ot.Q_240P;case"low":return Ot.Q_360P;case"sd":case"medium":return Ot.Q_480P;case"hd":case"high":return Ot.Q_720P;case"fullhd":case"full":return Ot.Q_1080P;case"quadhd":case"quad":return Ot.Q_1440P;case"ultrahd":case"ultra":return Ot.Q_2160P}};import{isNonNullable as K,isNullable as zs,now as ku,isHigher as Qs,isHigherOrEqual as bi,isInvariantQuality as Ws,isLowerOrEqual as gi,videoSizeToQuality as wu,assertNotEmptyArray as qs,assertNonNullable as Au}from"@vkontakte/videoplayer-shared/evergreen";var bn=!1,wt={},bu=n=>{bn=n},gu=()=>{wt={}},Su=n=>{n(wt)},zi=(n,e)=>{bn&&(wt.meta=wt.meta??{},wt.meta[n]=e)},Re=class{constructor(e){this.name=e}next(e){if(!bn)return;wt.series=wt.series??{};let t=wt.series[this.name]??[];t.push([Date.now(),e]),wt.series[this.name]=t}};import{isHigher as Vd,isHigherOrEqual as jg,isLower as vu,isLowerOrEqual as zg,isNonNullable as Ns,isNullable as Cd,videoHeightToQuality as Us}from"@vkontakte/videoplayer-shared/evergreen";function gn(n,e,t){return!n.max&&n.min===e?"high_quality":!n.min&&n.max===t?"traffic_saving":"unknown"}function Hs(n,e,t){return!!n&&gn(n,e,t)==="high_quality"}function fi(n,e,t){return Cd(n)||Ns(n.min)&&Ns(n.max)&&vu(n.max,n.min)||Ns(n.min)&&e&&Vd(n.min,e)||Ns(n.max)&&t&&vu(n.max,t)}function yu({limits:n,highestAvailableHeight:e,lowestAvailableHeight:t}){return fi({max:n?.max?Us(n.max):void 0,min:n?.min?Us(n.min):void 0},e?Us(e):void 0,t?Us(t):void 0)}var Pu=new Re("best_bitrate"),Gs=(n,e,t)=>(e-t)*Math.pow(2,-10*n)+t;var Si=n=>(e,t)=>n*(Number(e.bitrate)-Number(t.bitrate)),_t=class{constructor(){this.history={}}recordSelection(e){this.history[e.id]=ku()}recordSwitch(e){this.last=e}clear(){this.last=void 0,this.history={}}},Ys='Assertion "ABR Tracks is empty array" failed',js=new WeakMap,Tu=new WeakMap,Iu=new WeakMap,Qi=(n,e,t,i)=>{let r=[...e].sort(Si(1)),s=[...t].sort(Si(1)),a=s.filter(u=>K(u.bitrate)&&K(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)},Wi=(n,e,t,i)=>{let r=js.get(e);r||(r=[...e].sort(Si(1)),js.set(e,r));let s=js.get(t);s||(s=[...t].sort(Si(1)),js.set(t,s));let a=Iu.get(n);a||(a=s.filter(u=>K(u.bitrate)&&K(n.bitrate)?n.bitrate/u.bitrate>i:!0),Iu.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)},xu=n=>"quality"in n,Ks=(n,e,t,i)=>{let r=K(i?.last?.bitrate)&&K(t?.bitrate)&&i.last.bitrate<t.bitrate?n.trackCooldownIncreaseQuality:n.trackCooldownDecreaseQuality,s=t&&i&&i.history[t.id]&&ku()-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=xu(a)?"video":"audio",u=xu(a)?a.quality:a.bitrate;return e({message:`
6
+ var Oo="2.0.135-dev.7c676fc4.0";var Ce=(r=>(r.STOPPED="stopped",r.READY="ready",r.PLAYING="playing",r.PAUSED="paused",r))(Ce||{}),Et=(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))(Et||{});var As=(r=>(r.NOT_AVAILABLE="NOT_AVAILABLE",r.AVAILABLE="AVAILABLE",r.CONNECTING="CONNECTING",r.CONNECTED="CONNECTED",r))(As||{}),tn=(i=>(i.HTTP1="http1",i.HTTP2="http2",i.QUIC="quic",i))(tn||{});var rn=(a=>(a.NONE="none",a.INLINE="inline",a.FULLSCREEN="fullscreen",a.SECOND_SCREEN="second_screen",a.PIP="pip",a.INVISIBLE="invisible",a))(rn||{}),Ps=(i=>(i.TRAFFIC_SAVING="traffic_saving",i.HIGH_QUALITY="high_quality",i.UNKNOWN="unknown",i))(Ps||{});import{assertNever as jo,assertNonNullable as qc,isNonNullable as Ms,ValueSubject as sn,Subject as Gc,Subscription as Yc,merge as Kc,observableFrom as Xc,fromEvent as _o,map as No,tap as Uo,filterChanged as Jc,isNullable as an,ErrorCategory as Ho}from"@vkontakte/videoplayer-shared/evergreen";var Fo=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 Ls=class{constructor(e){this.connection$=new sn(void 0);this.castState$=new sn("NOT_AVAILABLE");this.errorEvent$=new Gc;this.realCastState$=new sn("NOT_AVAILABLE");this.subscription=new Yc;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=Ms(window.chrome?.cast),r=!!window.__onGCastApiAvailable;i?this.initializeCastApi():(window.__onGCastApiAvailable=s=>{delete window.__onGCastApiAvailable,s&&!this.isDestroyed&&this.initializeCastApi()},r||Fo("https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1").catch(()=>this.errorEvent$.next({id:"ChromecastLoading",category:Ho.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(){Ms(this.connection$.getValue())?this.disconnect():this.connect()}setVolume(e){let t=this.connection$.getValue();an(t)||(t.remotePlayer.volumeLevel=e,t.remotePlayerController.setVolumeLevel())}setMuted(e){let t=this.connection$.getValue();an(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 jo(r.sessionState)}})).add(Kc(_o(i,cast.framework.CastContextEventType.CAST_STATE_CHANGED).pipe(Uo(r=>{this.log({message:`[cast.framework.RemotePlayerEventType.CAST_STATE_CHANGED]: ${JSON.stringify(r)}`})}),No(r=>r.castState)),Xc([i.getCastState()])).pipe(Jc(),No(Zc),Uo(r=>{this.log({message:`realCastState$: ${r}`})})).subscribe(this.realCastState$)).add(this.realCastState$.subscribe(r=>{let s=r==="CONNECTED",a=Ms(this.connection$.getValue());if(s&&!a){let o=i.getCurrentSession();qc(o);let u=o.getCastDevice(),l=o.getMediaSession()?.media?.contentId;(an(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"?Ms(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:Ho.EXTERNAL_API,message:"[initializeCastApi] failed",thrown:r})}}},Zc=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 jo(n)}};import{assertNever as zo}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:zo(t)}return n},Ct=(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:zo(e)}};var M=(n,e,t=!1)=>{let i=n.getTransition();(t||!i||i.to===e)&&n.setState(e)};import{isNonNullable as ed,Subject as Bs,merge as Qo}from"@vkontakte/videoplayer-shared/evergreen";var _=class{constructor(e){this.transitionStarted$=new Bs;this.transitionEnded$=new Bs;this.transitionUpdated$=new Bs;this.forceChanged$=new Bs;this.stateChangeStarted$=Qo(this.transitionStarted$,this.transitionUpdated$);this.stateChangeEnded$=Qo(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||ed(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 td}from"@vkontakte/videoplayer-shared/evergreen";var Wo=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 td(n)}};import{assertNever as pi,assertNonNullable as Xt,debounce as qo,ErrorCategory as Go,fromEvent as Jt,isNonNullable as Yo,map as Ko,merge as Xo,observableFrom as id,Subject as rd,Subscription as nn,timeout as sd,getHighestQuality as ad}from"@vkontakte/videoplayer-shared/evergreen";var nd=5,od=5,ud=500,Jo=7e3,_i=class{constructor(e){this.subscription=new nn;this.loadMediaTimeoutSubscription=new nn;this.videoState=new _("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:pi(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:pi(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:pi(e)}break}default:pi(i)}}};this.params=e,this.log=this.params.dependencies.logger.createComponentLog("ChromecastProvider"),this.log({message:`constructor, format: ${e.format}`}),this.params.output.isLive$.next(Wo(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 nn;this.subscription.add(e),this.subscription.add(Xo(this.videoState.stateChangeStarted$.pipe(Ko(r=>`stateChangeStarted$ ${JSON.stringify(r)}`)),this.videoState.stateChangeEnded$.pipe(Ko(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 rd;e.add(r.pipe(qo(ud)).subscribe(()=>{this.params.output.seekedEvent$.next()}));let s=NaN;e.add(Jt(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)>nd)&&r.next(o),s=o})),e.add(Jt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.DURATION_CHANGED).subscribe(a=>{this.logRemoteEvent(a),this.params.output.duration$.next(a.value)}))}t(Jt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MEDIA_LOADED_CHANGED),r=>{this.logRemoteEvent(r),r.value?this.handleRemoteReady():(this.handleRemoteStop(),e.unsubscribe())}),t(Jt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED),r=>{this.logRemoteEvent(r),r.value?this.handleRemotePause():this.handleRemotePlay()}),t(Jt(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<od&&this.params.output.endedEvent$.next(),this.handleRemoteStop(),M(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:pi(a)}}),t(Jt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED),r=>{this.logRemoteEvent(r),this.handleRemoteVolumeChange({volume:r.value})}),t(Jt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED),r=>{this.logRemoteEvent(r),this.handleRemoteVolumeChange({muted:r.value})});let i=Xo(this.params.desiredState.playbackState.stateChangeStarted$,this.params.desiredState.seekState.stateChangeEnded$,this.videoState.stateChangeEnded$,id(["init"])).pipe(qo(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"),M(this.params.desiredState.playbackState,"paused")):(this.videoState.setState("playing"),M(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"),M(this.params.desiredState.playbackState,"paused"))}handleRemotePlay(){let e=this.videoState.getState();(this.videoState.getTransition()?.to==="playing"||e==="paused")&&(this.videoState.setState("playing"),M(this.params.desiredState.playbackState,"playing"))}handleRemoteReady(){this.videoState.getTransition()?.to==="ready"&&this.videoState.setState("ready"),this.params.desiredState.playbackState.getTransition()?.to==="ready"&&M(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];Xt(l);let p=ad(Object.keys(l));Xt(p);let c=l[p];Xt(c),i=c,r="video/mp4",s=chrome.cast.media.StreamType.BUFFERED;break}case"HLS":case"HLS_ONDEMAND":{let l=t[e];Xt(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];Xt(l),i=l.url,r="application/dash+xml",s=chrome.cast.media.StreamType.BUFFERED;break}case"DASH_LIVE_CMAF":{let l=t[e];Xt(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];Xt(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",p=new Error(l);throw this.params.output.error$.next({id:"ChromecastProvider.createMediaInfo()",category:Go.VIDEO_PIPELINE,message:l,thrown:p}),p}case"DASH":case"DASH_LIVE_WEBM":throw new Error(`${e} is no longer supported`);default:return pi(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 Yo(o)&&(a.metadata.title=o),Yo(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(sd(Jo).subscribe(()=>s(`timeout(${Jo})`)))});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:Go.VIDEO_PIPELINE,message:s,thrown:r})}).finally(()=>{this.loadMediaTimeoutSubscription.unsubscribe()})}logRemoteEvent(e){this.log({message:`[remoteEvent] ${JSON.stringify(e)}`})}};import{clearVideoElement as eu}from"@vkontakte/videoplayer-shared/evergreen";import{clearVideoElement as ld}from"@vkontakte/videoplayer-shared/evergreen";var Zo=n=>{try{n.pause(),n.playbackRate=0,ld(n),n.remove()}catch(e){console.error(e)}};import{fromEvent as cd,Subscription as dd}from"@vkontakte/videoplayer-shared/evergreen";var on=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)}},un=window.WeakMap?new WeakMap:new on,ln=window.WeakMap?new WeakMap:new Map,pd=(n,e=20)=>{let t=0;return cd(n,"ratechange").subscribe(i=>{t++,t>=e&&(n.currentTime=n.currentTime,t=0)})},Oe=(n,{audioVideoSyncRate:e,disableYandexPiP:t})=>{let i=n.querySelector("video"),r=!!i;i?eu(i):(i=document.createElement("video"),n.appendChild(i)),un.set(i,r);let s=new dd;return s.add(pd(i,e)),ln.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},Fe=n=>{ln.get(n)?.unsubscribe(),ln.delete(n);let t=un.get(n);un.delete(n),t?eu(n):Zo(n)};import{assertNonNullable as Ui,isNonNullable as pt,isNullable as fd,fromEvent as hi,merge as tu,observableFrom as iu,filterChanged as ru,map as Hi,Subject as su,Subscription as bd,ValueSubject as gd,ErrorCategory as Sd}from"@vkontakte/videoplayer-shared/evergreen";import{isNonNullable as cn,isNullable as hd,Subscription as md}from"@vkontakte/videoplayer-shared/evergreen";var $s=(n,e,t,{equal:i=(a,o)=>a===o,changed$:r,onError:s}={})=>{let a=n.getState(),o=e(),u=hd(r),l=new md;return r&&l.add(r.subscribe(p=>{let c=n.getState();i(p,c)&&n.setState(p)},s)),i(o,a)||(t(a),u&&n.setState(a)),l.add(n.stateChangeStarted$.subscribe(p=>{t(p.to),u&&n.setState(p.to)},s)),l},dt=(n,e,t)=>$s(e,()=>n.loop,i=>{cn(i)&&(n.loop=i)},{onError:t}),_e=(n,e,t,i)=>$s(e,()=>({muted:n.muted,volume:n.volume}),r=>{cn(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}),et=(n,e,t,i)=>$s(e,()=>n.playbackRate,r=>{cn(r)&&(n.playbackRate=r)},{changed$:t,onError:i}),Ni=$s;var vd=n=>["__",n.language,n.label].join("|"),yd=(n,e)=>{if(n.id===e)return!0;let[t,i,r]=e.split("|");return n.language===i&&n.label===r},dn=class n{constructor(e){this.available$=new su;this.current$=new gd(void 0);this.error$=new su;this.subscription=new bd;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:Sd.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(Ni(t.internalTextTracks,()=>Object.values(this.internalTracks),s=>{pt(s)&&this.setInternal(s)},{equal:(s,a)=>pt(s)&&pt(a)&&s.length===a.length&&s.every(({id:o},u)=>o===a[u].id),changed$:this.available$.pipe(Hi(s=>s.filter(({type:a})=>a==="internal"))),onError:r})),this.subscription.add(Ni(t.externalTextTracks,()=>Object.values(this.externalTracks),s=>{pt(s)&&this.setExternal(s)},{equal:(s,a)=>pt(s)&&pt(a)&&s.length===a.length&&s.every(({id:o},u)=>o===a[u].id),changed$:this.available$.pipe(Hi(s=>s.filter(({type:a})=>a==="external"))),onError:r})),this.subscription.add(Ni(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(Ni(t.textTrackCuesSettings,()=>({}),()=>{if(this.video)for(let s of this.htmlTextTracksAsArray())this.applyCueSettings(s.cues),this.applyCueSettings(s.activeCues)}))}subscribe(){Ui(this.video);let{textTracks:e}=this.video;this.subscription.add(hi(e,"addtrack").subscribe(()=>{let i=this.current$.getValue();i&&this.select(i)})),this.subscription.add(tu(hi(e,"addtrack"),hi(e,"removetrack"),iu(["init"])).pipe(Hi(()=>this.htmlTextTracksAsArray().map(i=>this.htmlTextTrackToITextTrack(i))),ru((i,r)=>i.length===r.length&&i.every(({id:s},a)=>s===r[a].id))).subscribe(this.available$)),this.subscription.add(tu(hi(e,"change"),iu(["init"])).pipe(Hi(()=>this.htmlTextTracksAsArray().find(({mode:i})=>i==="showing")),Hi(i=>i&&this.htmlTextTrackToITextTrack(i).id),ru()).subscribe(this.current$));let t=i=>this.applyCueSettings(i.target?.activeCues??null);this.subscription.add(hi(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(hi(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;pt(t.align)&&(r.align=t.align),pt(t.position)&&(r.position=t.position),pt(t.size)&&(r.size=t.size),pt(t.line)&&(r.line=t.line)}}htmlTextTracksAsArray(e=!1){Ui(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:vd(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){Ui(this.video);for(let t of this.htmlTextTracksAsArray(!0))t.mode="showing";for(let t of this.htmlTextTracksAsArray(!0))(fd(e)||!yd(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){Ui(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){Ui(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)}},tt=dn;var Zt=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 au=n=>{let e=n;for(;!(e instanceof Document)&&!(e instanceof ShadowRoot)&&e!==null;)e=e?.parentNode;return e??void 0},pn=n=>{let e=au(n);return!!(e&&e.fullscreenElement&&e.fullscreenElement===n)},nu=n=>{let e=au(n);return!!(e&&e.pictureInPictureElement&&e.pictureInPictureElement===n)};import{fromEvent as $e,map as ht,merge as _s,filterChanged as hu,isNonNullable as mu,Subject as Md,filter as mn,mapTo as fn,combine as Ld,once as Bd,throttle as $d,ErrorCategory as Rd,ValueSubject as fu,Subscription as Dd}from"@vkontakte/videoplayer-shared/evergreen";var Td=3,ou=(n,e,t=Td)=>{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 Rs=class{constructor(){this._isMiuiBrowser=!1}get current(){return this._current}get isChrome(){return this.current==="Chrome"}get isFirefox(){return this.current==="Firefox"}get isSafari(){return this.current==="Safari"}get isOpera(){return this.current==="Opera"}get isEdge(){return this.current==="Edge"}get isYandex(){return this.current==="Yandex"}get isSamsungBrowser(){return this.current==="SamsungBrowser"}get currentVersion(){return this._current_version}get chromeVersion(){return this._chromeVersion}get firefoxVersion(){return this._firefoxVersion}get safariVersion(){return this._safariVersion}get operaVersion(){return this._operaVersion}get edgeVersion(){return this._edgeVersion}get yandexVersion(){return this._yandexVersion}get isMiuiBrowser(){return this._isMiuiBrowser}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._isMiuiBrowser=/(XiaoMi)|(MiuiBrowser)/i.test(e),this._current=t||i||a||u||l||r||s||o||"Rest"}catch(t){console.error(t)}this.isChrome&&this.detectChromeVersion(),this.isFirefox&&this.detectFirefoxVersion(),this.isSafari&&this.detectSafariVersion(),this.isOpera&&this.detectOperaVersion(),this.isEdge&&this.detectEdgeVersion(),this.isYandex&&this.detectYandexVersion()}detectVersion(e){try{let{userAgent:t}=window.navigator,i=t.match(e);if(!i)return;let r=i[1],s=parseInt(r,10);if(!isNaN(s))return this._current_version=s,s}catch(t){console.error(t)}}detectChromeVersion(){this._chromeVersion=this.detectVersion(/Chrome\/(\d+\.\d+)/)}detectFirefoxVersion(){this._firefoxVersion=this.detectVersion(/Firefox\/(\d+\.\d+)/)}detectSafariVersion(){this._safariVersion=this.detectVersion(/Version\/(\d+)/)}detectOperaVersion(){this._operaVersion=this.detectVersion(/OPR\/(\d+\.\d+)/)}detectEdgeVersion(){this._edgeVersion=this.detectVersion(/Edg\/(\d+\.\d+)/)}detectYandexVersion(){this._yandexVersion=this.detectVersion(/YaBrowser\/(\d+\.\d+\.\d+)/)}};var ji=()=>/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(navigator.appVersion??navigator.userAgent)||navigator?.userAgentData?.mobile;var Ds=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=ji()}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 Vs=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 Je=()=>window.ManagedMediaSource||window.MediaSource,mi=()=>!!(window.ManagedMediaSource&&window.ManagedSourceBuffer?.prototype?.appendBuffer),uu=()=>!!(window.MediaSource&&window.SourceBuffer?.prototype?.appendBuffer),Cs=()=>window.ManagedMediaSource?new ManagedMediaSource:new MediaSource;var Id=document.createElement("video"),xd='video/mp4; codecs="avc1.42000a,mp4a.40.2"',Ed='video/mp4; codecs="hev1.1.6.L93.B0"',lu='video/webm; codecs="vp09.00.10.08"',cu='video/webm; codecs="av01.0.00M.08"',kd='audio/mp4; codecs="mp4a.40.2"',wd='audio/webm; codecs="opus"',du,Ad=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:cu}}),window.navigator.mediaCapabilities.decodingInfo({...n,video:{...n.video,contentType:lu}})]);du={DASH_WEBM_AV1:e,DASH_WEBM:t}};Ad().catch(n=>{console.log(Id),console.error(n)});var Os=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 du}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:mi(),mse:uu(),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=!!Je()?.isTypeSupported?.(xd),t=!!Je()?.isTypeSupported?.(Ed),i=!!Je()?.isTypeSupported?.(kd);this._codecs={h264:e,h265:t,vp9:!!Je()?.isTypeSupported?.(lu),av1:!!Je()?.isTypeSupported?.(cu),aac:i,opus:!!Je()?.isTypeSupported?.(wd),mpeg:(e||t)&&i},this._nativeHlsSupported=this._protocols.hls&&this._containers.mp4}catch(e){console.error(e)}try{this.destroyVideoElement()}catch(e){console.error("Error destroying video element:",e)}}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 pu="audio/mpeg",Fs=class{supportMp3(){return this._codecs.mp3&&this._containers.mpeg}detect(){this._audio=document.createElement("audio");try{this._containers={mpeg:!!this._audio.canPlayType?.(pu)},this._codecs={mp3:!!Je()?.isTypeSupported?.(pu)}}catch(e){console.error(e)}try{this.destroyAudioElement()}catch(e){console.error("Error destroying audio element:",e)}}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 Pd}from"@vkontakte/videoplayer-shared/evergreen";var hn=class{constructor(){this.isInited$=new Pd(!1);this._displayChecker=new Vs,this._deviceChecker=new Ds(this._displayChecker),this._browserChecker=new Rs,this._videoChecker=new Os(this._deviceChecker,this._browserChecker),this._audioChecker=new Fs,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)}},O=new hn;var Ne=n=>{let e=g=>$e(n,g).pipe(fn(void 0)),t=new Dd,i=()=>t.unsubscribe(),r=_s($e(n,"progress"),$e(n,"timeupdate")).pipe(ht(()=>ou(n.buffered,n.currentTime))),s=O.browser.isSafari?Ld({play:e("play").pipe(Bd()),playing:e("playing")}).pipe(fn(void 0)):e("playing"),a=$e(n,"volumechange").pipe(ht(()=>({muted:n.muted,volume:n.volume}))),o=$e(n,"ratechange").pipe(ht(()=>n.playbackRate)),u=$e(n,"error").pipe(mn(()=>!!(n.error||n.played.length)),ht(()=>{let g=n.error;return{id:g?`MediaError#${g.code}`:"HtmlVideoError",category:Rd.VIDEO_PIPELINE,message:g?g.message:"Error event from HTML video element",thrown:n.error??void 0}})),l=$e(n,"timeupdate").pipe(ht(()=>n.currentTime)),p=["waiting","seeking","seeked","timeupdate"],c=new Md,d=.3,h;t.add(_s(...p.map(g=>$e(n,g))).subscribe(g=>{let R=n.currentTime;n.loop&&mu(h)&&mu(R)&&h>=n.duration-d&&R<=d&&c.next(h),h=R}));let m=e("pause").pipe(mn(()=>!n.error&&h!==n.duration)),f=$e(n,"enterpictureinpicture"),b=$e(n,"leavepictureinpicture"),S=new fu(nu(n));t.add(f.subscribe(()=>S.next(!0))),t.add(b.subscribe(()=>S.next(!1)));let x=new fu(pn(n)),v=$e(n,"fullscreenchange");t.add(v.pipe(ht(()=>pn(n))).subscribe(x));let I=.1,E=1e3,L=$e(n,"timeupdate").pipe(ht(g=>n.duration-n.currentTime<I),hu()),V=_s(L.pipe(mn(g=>!n.loop&&g)),$e(n,"ended")).pipe($d(E),fn(void 0)),w=_s(...["waiting","pause","canplay","play","canplaythrough","playing","seeking","seeked","ended"].map(g=>$e(n,g)),L.pipe(ht(g=>({type:g?"ended":"unknown"})))).pipe(ht(g=>O.browser.isFirefox&&g.type==="ended"?n.readyState<2:n.readyState<3),hu());return{playing$:s,pause$:m,canplay$:e("canplay"),ended$:V,looped$:c,error$:u,seeked$:e("seeked"),seeking$:e("seeking"),progress$:e("progress"),loadStart$:e("loadstart"),loadedMetadata$:e("loadedmetadata"),loadedData$:e("loadeddata"),timeUpdate$:l,durationChange$:$e(n,"durationchange").pipe(ht(()=>n.duration)),isBuffering$:w,currentBuffer$:r,volumeState$:a,playbackRateState$:o,inPiP$:S,inFullscreen$:x,enterPip$:f,leavePip$:b,destroy:i}};import{VideoQuality as Ot}from"@vkontakte/videoplayer-shared/evergreen";var Ft=n=>{switch(n){case"mobile":return Ot.Q_144P;case"lowest":return Ot.Q_240P;case"low":return Ot.Q_360P;case"sd":case"medium":return Ot.Q_480P;case"hd":case"high":return Ot.Q_720P;case"fullhd":case"full":return Ot.Q_1080P;case"quadhd":case"quad":return Ot.Q_1440P;case"ultrahd":case"ultra":return Ot.Q_2160P}};import{isNonNullable as K,isNullable as zs,now as ku,isHigher as Qs,isHigherOrEqual as bi,isInvariantQuality as Ws,isLowerOrEqual as gi,videoSizeToQuality as wu,assertNotEmptyArray as qs,assertNonNullable as Au}from"@vkontakte/videoplayer-shared/evergreen";var bn=!1,wt={},bu=n=>{bn=n},gu=()=>{wt={}},Su=n=>{n(wt)},zi=(n,e)=>{bn&&(wt.meta=wt.meta??{},wt.meta[n]=e)},Re=class{constructor(e){this.name=e}next(e){if(!bn)return;wt.series=wt.series??{};let t=wt.series[this.name]??[];t.push([Date.now(),e]),wt.series[this.name]=t}};import{isHigher as Vd,isHigherOrEqual as jg,isLower as vu,isLowerOrEqual as zg,isNonNullable as Ns,isNullable as Cd,videoHeightToQuality as Us}from"@vkontakte/videoplayer-shared/evergreen";function gn(n,e,t){return!n.max&&n.min===e?"high_quality":!n.min&&n.max===t?"traffic_saving":"unknown"}function Hs(n,e,t){return!!n&&gn(n,e,t)==="high_quality"}function fi(n,e,t){return Cd(n)||Ns(n.min)&&Ns(n.max)&&vu(n.max,n.min)||Ns(n.min)&&e&&Vd(n.min,e)||Ns(n.max)&&t&&vu(n.max,t)}function yu({limits:n,highestAvailableHeight:e,lowestAvailableHeight:t}){return fi({max:n?.max?Us(n.max):void 0,min:n?.min?Us(n.min):void 0},e?Us(e):void 0,t?Us(t):void 0)}var Pu=new Re("best_bitrate"),Gs=(n,e,t)=>(e-t)*Math.pow(2,-10*n)+t;var Si=n=>(e,t)=>n*(Number(e.bitrate)-Number(t.bitrate)),_t=class{constructor(){this.history={}}recordSelection(e){this.history[e.id]=ku()}recordSwitch(e){this.last=e}clear(){this.last=void 0,this.history={}}},Ys='Assertion "ABR Tracks is empty array" failed',js=new WeakMap,Tu=new WeakMap,Iu=new WeakMap,Qi=(n,e,t,i)=>{let r=[...e].sort(Si(1)),s=[...t].sort(Si(1)),a=s.filter(u=>K(u.bitrate)&&K(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)},Wi=(n,e,t,i)=>{let r=js.get(e);r||(r=[...e].sort(Si(1)),js.set(e,r));let s=js.get(t);s||(s=[...t].sort(Si(1)),js.set(t,s));let a=Iu.get(n);a||(a=s.filter(u=>K(u.bitrate)&&K(n.bitrate)?n.bitrate/u.bitrate>i:!0),Iu.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)},xu=n=>"quality"in n,Ks=(n,e,t,i)=>{let r=K(i?.last?.bitrate)&&K(t?.bitrate)&&i.last.bitrate<t.bitrate?n.trackCooldownIncreaseQuality:n.trackCooldownDecreaseQuality,s=t&&i&&i.history[t.id]&&ku()-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=xu(a)?"video":"audio",u=xu(a)?a.quality:a.bitrate;return e({message:`
7
7
  [last ${o} selected] ${u}
8
8
  `}),a}return i?.recordSwitch(t),t},Od=(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&&O.display.pixelRatio){let s=O.display.pixelRatio;if(n.pixelRatioMultiplier)r*=n.pixelRatioMultiplier*(s-1)+1;else{let a=n.pixelRatioLogBase,[o=0,u=0,l=0]=n.pixelRatioLogCoefficients,p=Od(a,o*s+u)+l;Number.isFinite(p)&&(r*=p)}}return Hs(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}},Eu=new WeakMap,mt=(n,{container:e,estimatedThroughput:t,tuning:i,limits:r,reserve:s=0,forwardBufferHealth:a,playbackRate:o,current:u,history:l,visible:p,droppedVideoMaxQualityLimit:c,stallsVideoMaxQualityLimit:d,stallsPredictedThroughput:h,abrLogger:m,panelSize:f})=>{qs(n,Ys);let{containerSizeFactor:b,containerSizeLimit:S}=Mu({container:e,tuning:i,limits:r,panelSize:f}),x=i.considerPlaybackRate&&K(o)?o:1,v=Eu.get(n);v||(v=n.filter(T=>!Ws(T.quality)).sort((T,A)=>Qs(T.quality,A.quality)?-1:1),Eu.set(n,v));let I=v.at(-1)?.quality,E=v.at(0)?.quality,L=fi(r,E,I),V=x*Gs(a??.5,i.bitrateFactorAtEmptyBuffer,i.bitrateFactorAtFullBuffer),k={},w=null;for(let T of v){let A=!0;if(S)if(T.size)A=T.size.width<=S.width&&T.size.height<=S.height;else{let P=S&&wu(S);A=P?gi(T.quality,P):!0}if(!A){k[T.quality]="FitsContainer";continue}let ee=h||t,$=K(ee)&&isFinite(ee)&&K(T.bitrate)?ee-s>=T.bitrate*V:!0,N=Hs(r,i.highQualityLimit,i.trafficSavingLimit)&&r?.min===T.quality;if(!$&&!N){k[T.quality]="FitsThroughput";continue}if(i.lazyQualitySwitch&&K(i.minBufferToSwitchUp)&&u&&!Ws(u.quality)&&(a??0)<i.minBufferToSwitchUp&&Qs(T.quality,u.quality)){k[T.quality]="Buffer";continue}if(!!c&&bi(T.quality,c)&&!N){k[T.quality]="DroppedFramesLimit";continue}if(!!d&&bi(T.quality,d)&&!N){k[T.quality]="StallsLimit";continue}let se=L||(zs(r?.max)||gi(T.quality,r.max))&&(zs(r?.min)||bi(T.quality,r.min)),X=K(p)&&!p?gi(T.quality,i.backgroundVideoQualityLimit):!0;if(!se||!X){k[T.quality]="FitsQualityLimits";continue}w||(w=T)}w&&w.bitrate&&Pu.next(w.bitrate);let g=w??v.at(-1)??n[0],R=l?.last,y=Ks(i,m,g,l);return K(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.135-dev.460bdb40.0",
3
+ "version": "2.0.135-dev.7c676fc4.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,6 +54,6 @@
54
54
  "**/*.d.ts"
55
55
  ],
56
56
  "dependencies": {
57
- "@vkontakte/videoplayer-shared": "1.0.63-dev.8749d62b.0"
57
+ "@vkontakte/videoplayer-shared": "1.0.63-dev.a1b53c4c.0"
58
58
  }
59
59
  }