@vkontakte/videoplayer-core 2.0.181-beta.0 → 2.0.181-beta.1
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/es2015.cjs +3 -3
- package/es2015.esm.js +4 -4
- package/esnext.cjs +3 -3
- package/esnext.esm.js +3 -3
- package/evergreen.esm.js +3 -3
- package/package.json +2 -2
package/esnext.esm.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @vkontakte/videoplayer-core v2.0.181-beta.
|
|
3
|
-
*
|
|
2
|
+
* @vkontakte/videoplayer-core v2.0.181-beta.1
|
|
3
|
+
* Mon, 02 Nov 2026 13:10:41 GMT
|
|
4
4
|
* https://st.mycdn.me/static/vkontakte-videoplayer/2-0-181/doc/
|
|
5
5
|
*/
|
|
6
|
-
var e=`2.0.181-beta.0`,t;(e=>{e.STOPPED=`stopped`,e.READY=`ready`,e.PLAYING=`playing`,e.PAUSED=`paused`})(t||={});var n;(e=>{e.MPEG=`MPEG`,e.DASH=`DASH`,e.DASH_SEP=`DASH_SEP`,e.DASH_SEP_VK=`DASH_SEP`,e.DASH_WEBM=`DASH_WEBM`,e.DASH_WEBM_AV1=`DASH_WEBM_AV1`,e.DASH_STREAMS=`DASH_STREAMS`,e.DASH_WEBM_VK=`DASH_WEBM`,e.DASH_ONDEMAND=`DASH_ONDEMAND`,e.DASH_ONDEMAND_VK=`DASH_ONDEMAND`,e.DASH_LIVE=`DASH_LIVE`,e.DASH_LIVE_CMAF=`DASH_LIVE_CMAF`,e.DASH_LIVE_WEBM=`DASH_LIVE_WEBM`,e.HLS=`HLS`,e.HLS_ONDEMAND=`HLS_ONDEMAND`,e.HLS_JS=`HLS`,e.HLS_FMP4=`HLS_FMP4`,e.HLS_LIVE=`HLS_LIVE`,e.HLS_LIVE_CMAF=`HLS_LIVE_CMAF`,e.WEB_RTC_LIVE=`WEB_RTC_LIVE`})(n||={});var r;(e=>{e.AV1=`av1`,e.VP9=`vp9`,e.AVC1=`avc1`,e.HEV1=`hev1`})(r||={});var i;(e=>{e.NOT_AVAILABLE=`NOT_AVAILABLE`,e.AVAILABLE=`AVAILABLE`,e.CONNECTING=`CONNECTING`,e.CONNECTED=`CONNECTED`})(i||={});var a;(e=>{e.HTTP1=`http1`,e.HTTP2=`http2`,e.QUIC=`quic`})(a||={});var o;(e=>{e.NONE=`none`,e.INLINE=`inline`,e.FULLSCREEN=`fullscreen`,e.SECOND_SCREEN=`second_screen`,e.PIP=`pip`,e.INVISIBLE=`invisible`})(o||={});var s;(e=>{e.TRAFFIC_SAVING=`traffic_saving`,e.HIGH_QUALITY=`high_quality`,e.UNKNOWN=`unknown`})(s||={});import{assertNever as c,assertNonNullable as l,isNonNullable as u,ValueSubject as d,Subject as f,Subscription as p,merge as m,observableFrom as h,fromEvent as g,map as _,tap as v,filterChanged as y,isNullable as b,ErrorCategory as x}from"@vkontakte/videoplayer-shared";var S=e=>new Promise((t,n)=>{let r=document.createElement(`script`);r.setAttribute(`src`,e),r.onload=()=>t(),r.onerror=e=>n(e),document.body.appendChild(r)});class C{connection$=new d(void 0);castState$=new d(`NOT_AVAILABLE`);errorEvent$=new f;contentId;realCastState$=new d(`NOT_AVAILABLE`);subscription=new p;log;params;isDestroyed=!1;constructor(e){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 n=u(window.chrome?.cast),r=!!window.__onGCastApiAvailable;n?this.initializeCastApi():(window.__onGCastApiAvailable=e=>{delete window.__onGCastApiAvailable,e&&!this.isDestroyed&&this.initializeCastApi()},r||S(`https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1`).catch(()=>this.errorEvent$.next({id:`ChromecastLoading`,category:x.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(){u(this.connection$.getValue())?this.disconnect():this.connect()}setVolume(e){let t=this.connection$.getValue();b(t)||(t.remotePlayer.volumeLevel=e,t.remotePlayerController.setVolumeLevel())}setMuted(e){let t=this.connection$.getValue();b(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),n=cast.framework.CastContext.getInstance();this.subscription.add(g(n,cast.framework.CastContextEventType.SESSION_STATE_CHANGED).subscribe(e=>{switch(e.sessionState){case cast.framework.SessionState.SESSION_STARTED:case cast.framework.SessionState.SESSION_STARTING:case cast.framework.SessionState.SESSION_RESUMED:this.contentId=n.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 c(e.sessionState)}})).add(m(g(n,cast.framework.CastContextEventType.CAST_STATE_CHANGED).pipe(v(e=>{this.log({message:`[cast.framework.RemotePlayerEventType.CAST_STATE_CHANGED]: ${JSON.stringify(e)}`})}),_(e=>e.castState)),h([n.getCastState()])).pipe(y(),_(ee),v(e=>{this.log({message:`realCastState$: ${e}`})})).subscribe(this.realCastState$)).add(this.realCastState$.subscribe(r=>{let i=r===`CONNECTED`,a=u(this.connection$.getValue());if(i&&!a){let r=n.getCurrentSession();l(r);let i=r.getCastDevice(),a=r.getMediaSession()?.media?.contentId;(b(a)||a===this.contentId)&&(this.log({message:`connection created`}),this.connection$.next({remotePlayer:e,remotePlayerController:t,session:r,castDevice:i}))}else!i&&a&&(this.log({message:`connection destroyed`}),this.connection$.next(void 0));this.castState$.next(r===`CONNECTED`?u(this.connection$.getValue())?`CONNECTED`:`AVAILABLE`:r)}))}initializeCastApi(){let e,t,n;try{e=cast.framework.CastContext.getInstance(),t=chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,n=chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED}catch{return}try{e.setOptions({receiverApplicationId:this.params.receiverApplicationId??t,autoJoinPolicy:n}),this.initListeners()}catch(e){this.errorEvent$.next({id:`ChromecastInitializer`,category:x.EXTERNAL_API,message:`[initializeCastApi] failed`,thrown:e})}}}var ee=e=>{switch(e){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 c(e)}};import{assertNonNullable as w,combine as T,debounce as E,ErrorCategory as D,filter as O,filterChanged as te,isNonNullable as ne,isNullable as re,map as ie,Subscription as ae,ValueSubject as oe}from"@vkontakte/videoplayer-shared";import{assertNever as se,assertNonNullable as ce,ErrorCategory as le,getHighestQuality as ue,isNonNullable as de}from"@vkontakte/videoplayer-shared";import{assertNever as fe}from"@vkontakte/videoplayer-shared";var pe=`_offset_p`,me=e=>{if(e.includes(pe))return!0;try{return new URL(e).searchParams.has(`offset_p`)}catch{return!1}},k=(e,t=0,n=0)=>{switch(n){case 0:return e.replace(pe,t===0?``:`_`+t.toFixed(0));case 1:{if(t===0)return e;let n=new URL(e);return n.searchParams.append(`playback_shift`,t.toFixed(0)),n.toString()}case 2:{let n=new URL(e);return!n.searchParams.get(`offset_p`)&&t===0?e:(n.searchParams.set(`offset_p`,t.toFixed(0)),n.toString())}default:fe(n)}return e},he=(e,t)=>{switch(t){case 0:return NaN;case 1:{let t=new URL(e);return Number(t.searchParams.get(`playback_shift`))}case 2:{let t=new URL(e);return Number(t.searchParams.get(`offset_p`)??0)}default:fe(t)}},ge=e=>{let{source:t,format:n,meta:r,output:i}=e,a,o,s;switch(n){case`MPEG`:{let e=t[n];ce(e);let r=ue(Object.keys(e));ce(r);let i=e[r];ce(i),a=i,o=`video/mp4`,s=_e();break}case`HLS`:case`HLS_FMP4`:case`HLS_ONDEMAND`:{let e=t[n];ce(e),a=e.url,o=`application/x-mpegurl`,s=_e();break}case`DASH_SEP`:case`DASH_ONDEMAND`:case`DASH_WEBM`:case`DASH_WEBM_AV1`:case`DASH_STREAMS`:{let e=t[n];ce(e),a=e.url,o=`application/dash+xml`,s=_e();break}case`DASH_LIVE_CMAF`:{let e=t[n];ce(e),a=e.url,o=`application/dash+xml`,s=ve();break}case`HLS_LIVE`:case`HLS_LIVE_CMAF`:{let e=t[n];ce(e),a=k(e.url),o=`application/x-mpegurl`,s=ve();break}case`DASH_LIVE`:case`WEB_RTC_LIVE`:{let e=`Unsupported format for Chromecast`,t=Error(e);throw i.error$.next({id:`ChromecastProvider.createMediaInfo()`,category:le.VIDEO_PIPELINE,message:e,thrown:t}),t}case`DASH`:case`DASH_LIVE_WEBM`:throw Error(`${n} is no longer supported`);default:return se(n)}let c=ye(r.videoId??a,o);c.contentUrl=a,c.streamType=s,c.metadata=be();let{title:l,subtitle:u}=r;return de(l)&&(c.metadata.title=l),de(u)&&(c.metadata.subtitle=u),c};function _e(){return chrome.cast?.media?.StreamType?.BUFFERED??`BUFFERED`}function ve(){return chrome.cast?.media?.StreamType?.LIVE??`LIVE`}function ye(e,t){return chrome.cast?.media?.MediaInfo?new chrome.cast.media.MediaInfo(e,t):{contentId:e,contentType:t,metadata:{title:``,subtitle:``},streamType:_e()}}function be(){return chrome.cast?.media?.GenericMediaMetadata?new chrome.cast.media.GenericMediaMetadata:{images:[],metadataType:0,releaseDate:``,subtitle:``,title:``,releaseYear:1970,type:0}}var A=(e,t,n=!1)=>{let r=e.getTransition();(n||!r||r.to===t)&&e.setState(t)};import{createTimers as xe,TimerModule as Se}from"@vkontakte/videoplayer-shared";var j=xe(Se.CORE);class Ce{params;interval=0;startVideoPosition;startTs;constructor(e){this.params=e}start(e=0){j.clearInterval(this.interval),this.startVideoPosition=e,this.startTs=Date.now(),this.interval=j.setInterval(()=>{let e=(Date.now()-this.startTs)/1e3,t=this.startVideoPosition+e;this.params.output.position$.next(t)},1e3)}pause(){j.clearInterval(this.interval)}destroy(){j.clearInterval(this.interval)}}import{assertNever as we}from"@vkontakte/videoplayer-shared";import{isBrowserWindow as Te,ValueSubject as Ee}from"@vkontakte/videoplayer-shared";import{getWindow as De,isNullable as Oe}from"@vkontakte/videoplayer-shared";class ke{_current;_current_version;_chromeVersion;_firefoxVersion;_safariVersion;_operaVersion;_edgeVersion;_yandexVersion;_isMiuiBrowser=!1;get current(){return this._current}get isChrome(){return this.current===`Chrome`}get isChromiumBased(){return[`Chrome`,`Chromium`,`Opera`,`Yandex`,`Edge`,`SamsungBrowser`].includes(this.current)}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,n=/samsungbrowser/i.test(e)?`SamsungBrowser`:void 0,r=/chrome|crios/i.test(e)?`Chrome`:void 0,i=/chromium/i.test(e)?`Chromium`:void 0,a=/firefox|fxios/i.test(e)?`Firefox`:void 0,o=/smart-tv;.*tizen/i.test(e)?`Chrome`:void 0,s=/webkit|safari|khtml/i.test(e)?`Safari`:void 0,c=/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||n||a||c||l||r||i||o||s||`Rest`}catch(e){console.error(e)}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}=De().navigator,n=t.match(e);if(!n)return;let r=n[1],i=parseInt(r,10);if(!isNaN(i))return this._current_version=i,i}catch(e){console.error(e)}}detectChromeVersion(){this._chromeVersion=this.detectVersion(/Chrome\/(\d+\.\d+)/),Oe(this._chromeVersion)&&(this._chromeVersion=this.detectVersion(/(\d+\.\d+\.\d+\.\d+)\/\d+\.\d+ TV/))}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+)/)}}import{getWindow as Ae,isBrowserWindow as je}from"@vkontakte/videoplayer-shared";var Me=()=>/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(navigator.appVersion??navigator.userAgent)||navigator?.userAgentData?.mobile;class Ne{_displayChecker;_isMobile;_isSmartTV=!1;_current;_iosVersion;_highEntropyValues={};_os={name:`Unknown`,version:`Unknown`,full:`Unknown`};_details={vendor:`Unknown`,model:`Unknown`};_hardware={};_gpuDetection;constructor(e){this._displayChecker=e}get current(){return this._current}get os(){return this._os}get details(){return this._details}get isSmartTV(){return this._isSmartTV}get hardware(){return this._hardware}get highEntropyValues(){return this._highEntropyValues}get isIOS(){return this._highEntropyValues.platform===`iOS`||this.os.name.toLowerCase().includes(`ios`)||[`iPhone`,`iPad`,`iPod`].includes(this.current)}get isIPadOS(){let e=this.current===`Mac`&&this._displayChecker.isTouch;return this.current===`iPad`||e}get isMac(){return this._highEntropyValues.platform===`macOS`||this.os.name.toLowerCase().includes(`mac`)||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.os.name.toLowerCase().includes(`android`)||this.current===`Android`}get isWindows(){return this.os.name.toLowerCase().includes(`windows`)}get isLinux(){return this.os.name.toLowerCase().includes(`linux`)&&!this.isAndroid}get isMobile(){return this._highEntropyValues.mobile||this._isMobile}get isTablet(){if(this.isIPadOS||this._highEntropyValues.formFactors?.includes(`Tablet`))return!0;if(!this.isAndroid)return!1;let e=Ae();if(!je(e))return!1;let t=e.navigator;return t?t.userAgentData?.mobile===!1?!0:this._displayChecker.isTouch&&!/\bMobile\b/i.test(t.userAgent):!1}get iOSVersion(){return this._iosVersion}detect(){let e=Ae();if(!je(e))return;let{userAgent:t}=e.navigator;try{this._isMobile=Me()}catch(e){console.error(`DeviceChecker: calling isMobile error - `,e)}this.detectDevice(t),this.detectOS(t),this.detectDeviceDetails(t),this.detectHardware(e),this.detectHighEntropyValues(),this.isIOS&&this.detectIOSVersion(),this.detectSmartTv()}detectHardware(e){let t=e.navigator;try{this._hardware={cpuCores:t.hardwareConcurrency,memoryGb:t.deviceMemory}}catch(e){console.error(`DeviceChecker: detectHardware error - `,e)}}detectGpu(){return this._gpuDetection??=this.requestGpuInfo(),this._gpuDetection}async requestGpuInfo(){let e=Ae();if(je(e))try{let t=await e.navigator.gpu?.requestAdapter();this._hardware={...this._hardware,gpuVendor:t?.info?.vendor||void 0,gpuArchitecture:t?.info?.architecture||void 0}}catch(e){console.error(`DeviceChecker: detectGpu error - `,e)}}async detectHighEntropyValues(){let e=Ae();if(!je(e))return;let{userAgentData:t}=e.navigator;if(t?.getHighEntropyValues){let e=await t.getHighEntropyValues([`architecture`,`bitness`,`brands`,`mobile`,`platform`,`formFactors`,`model`,`platformVersion`,`wow64`]);this._highEntropyValues=e,e.platform&&(this._os.name=this.normalizeOSName(e.platform),e.platformVersion&&(this._os.version=this.normalizeOSVersion(e.platformVersion),this._os.full=`${this._os.name} ${this._os.version}`)),e.model&&(this._details.model=e.model)}}detectSmartTv(){try{this._isSmartTV=!1;let e=Ae();if(!je(e))return;let{userAgent:t}=e.navigator;this._isSmartTV=/smart[\w\-_ ]*tv/i.test(t)||/samsung/i.test(t)&&/tizen/i.test(t)}catch(e){console.error(`DeviceChecker: Smart TV detection error - `,e)}}detectDevice(e){try{let t=/android/i.test(e)?`Android`:void 0,n=/iphone/i.test(e)?`iPhone`:void 0,r=/ipad/i.test(e)?`iPad`:void 0,i=/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||n||r||i||o||a||`Desktop`}catch(e){console.error(`DeviceChecker: device detection error - `,e)}}detectOS(e){try{for(let[t,n]of[[/(windows nt) (6\.[23]); arm/i,[`Windows RT`]],[/(windows nt) (6\.3); arm/i,[`Windows RT 8.1`]],[/(windows (?:phone|mobile|iot))(?: os)?[/ ]?([\d.]+)/i,[`Windows Mobile`,2]],[/(windows)[/ ](xp|vista|7|8(\.1)?|10|11|2000|me)/i,[1,1]],[/windows nt ?([\d.]+)/i,[`Windows`,1]],[/(windows)[/ ](95|98|me|2000|xp|vista|7|8|8\.1|10|11)/i,[1,2]],[/(iphone os|cpu iphone os) ([\d_.]+)/i,[`iOS`,2]],[/(ipad os|cpu os) ([\d_.]+)/i,[`iPadOS`,2]],[/(ipod os|cpu ipod os) ([\d_.]+)/i,[`iOS`,2]],[/(?:ios|os) ([\d_.]+) like mac os x/i,[`iOS`,1]],[/cfnetwork\/.+darwin/i,[`iOS`]],[/(mac os x) ?([\d_.]+)/i,[`macOS`,2]],[/(macintosh|mac os)/i,[`macOS`]],[/(android) ([\d.]+)/i,[1,2]],[/(harmonyos)[/ ]?([\d.]*)/i,[`HarmonyOS`,2]],[/\b(ubuntu|debian|fedora|centos|arch|linux)(?:[-/ ]([\w.]+))?/i,[1,2]],[/(cros)\D*([\d.]+)/i,[`Chrome OS`,2]],[/(freebsd|openbsd|netbsd|dragonfly)[/ ]?([\w.]*)/i,[1,2]],[/(sunos|solaris)?([\d.]*)/i,[`Solaris`,2]],[/(aix)?([\d.]*)/i,[`AIX`,2]]]){let r=e.match(t);if(r){let t=n.length>0,i=n.length>1,a=`Unknown`,o=`Unknown`;if(t){let e=n[0];typeof e==`number`?e<r.length&&r[e]!==void 0&&(a=r[e]):a=e}if(i){let e=n[1];typeof e==`number`?e<r.length&&r[e]!==void 0&&(o=r[e]):e!==void 0&&(o=e)}else r[2]===void 0?r[1]!==void 0&&t&&typeof n[0]==`string`&&(o=r[1]):o=r[2];a=this.normalizeOSName(a),o=this.normalizeOSVersion(o,a),a===`iOS`&&/ipad/i.test(e)?a=`iPadOS`:a===`iPadOS`&&/ip(hone|od)/i.test(e)&&(a=`iOS`),this._os={name:a,version:o||`Unknown`,full:o&&o!==`Unknown`?`${a} ${o}`:a};break}}}catch(e){console.error(`DeviceChecker: OS detection error - `,e)}}normalizeOSName(e){if(!e)return`Unknown`;let t=e.toLowerCase();return t.includes(`windows`)?`Windows`:t.includes(`mac os`)||t.includes(`macintosh`)?`macOS`:t.includes(`iphone`)||t.includes(`ios`)?`iOS`:t.includes(`ipados`)?`iPadOS`:t.includes(`android`)?`Android`:t.includes(`harmonyos`)?`HarmonyOS`:t.includes(`linux`)?`Linux`:t.includes(`cros`)?`Chrome OS`:t.includes(`freebsd`)?`FreeBSD`:t.includes(`openbsd`)?`OpenBSD`:t.includes(`solaris`)||t.includes(`sunos`)?`Solaris`:t.includes(`aix`)?`AIX`:e}normalizeOSVersion(e,t){if(!e)return`Unknown`;if(e!==`Unknown`&&(e=e.replace(/_/g,`.`),t===`Windows`)){let t=parseFloat(e);if(!isNaN(t)){if(t>=11)return`11`;if(t>=10)return`10`;if(t===6.3)return`8.1`;if(t===6.2)return`8`;if(t===6.1)return`7`;if(t===6)return`Vista`;if(t===5.1||t===5.2)return`XP`;if(t===5)return`2000`;if(t===4)return`NT 4.0`}}return e}detectDeviceDetails(e){try{for(let[t,n]of[[/(iphone)/i,[`Apple`,`iPhone`]],[/(ipad)/i,[`Apple`,`iPad`]],[/(ipod)/i,[`Apple`,`iPod`]],[/(macintosh)/i,[`Apple`,`Macintosh`]],[/(windows[\w\-_ ]*phone)/i,[`Microsoft`,0]],[/(windows nt|win64|win32|wow64)/i,[`Microsoft`,`PC`]],[/\b(sch-i[89]0\d|shw-m380s|sm-[ptxs]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i,[`Samsung`,1]],[/\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?\d+a?|galaxy nexus)/i,[`Samsung`,1]],[/samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,[`Samsung`,1]],[/sec-(sgh\w+)/i,[`Samsung`,1]],[/smart-tv.+(samsung)/i,[`Samsung`,`Smart TV`]],[/(samsung).*tizen/i,[`Samsung`,`Smart TV`]],[/(pixel (?:c|tablet|[0-9a-z ]+))/i,[`Google`,1]],[/(pixelbook(?: go)?)/i,[`Google`,1]],[/nexus [0-9]/i,[`Google`,0]],[/(redmi[-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i,[`Xiaomi`,1]],[/\b(mi[\w\-_ ]+)(?: bui|\))/i,[`Xiaomi`,1]],[/\b(poco[\w ]+)(?: bui|\))/i,[`Xiaomi`,1]],[/\b(hm[-_ ]?note?[\w ]*)(?: bui|\))/i,[`Xiaomi`,1]],[/\b(?:xiao)?mi[\w\-_ ]+pad/i,[`Xiaomi`,0]],[/(?:huawei|honor) ?([-\w ]+)[;)]/i,[`Huawei`,1]],[/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i,[`Huawei`,1]],[/\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?)/i,[`Huawei`,1]],[/(?:one)?(?:plus)? ?([a\d0]\d\d\d?)(?: b|\))/i,[`OnePlus`,1]],[/droid.+; (cph2[3-6]\d[13579]|((?:gm|hd)19|(?:ac|be|in|kb)20|(?:d[en]|eb|le|mt)21|ne22)[0-2]\d)(?: bui|\))/i,[`OnePlus`,1]],[/(oneplus)[-_ ]?([-\w]*)/i,[`OnePlus`,2]],[/\b(rmx[1-3]\d{3})(?: bui|;|\))/i,[`Realme`,1]],[/(realme)[-_ ]?([-\w]*)/i,[`Realme`,2]],[/; (\w+) bui.+ oppo/i,[`OPPO`,1]],[/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i,[`OPPO`,1]],[/\b(opd2(\d{3}a?))(?: bui|\))/i,[`OPPO`,1]],[/(oppo)[-_ ]?([-\w]*)/i,[`OPPO`,2]],[/; vivo (\w+)(?: bui|\))/i,[`Vivo`,1]],[/\b(v[12]\d{3}\w?[at])(?: bui|;)/i,[`Vivo`,1]],[/(vivo)[-_ ]?([-\w]*)/i,[`Vivo`,2]],[/\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,[`Motorola`,1]],[/((?:moto(?! 360)[-\w() ]+|xt\d{3,4}[cgkosw+]?[-\d]*|nexus 6)(?= bui|\)))/i,[`Motorola`,1]],[/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b/i,[`Motorola`,0]],[/\b(mz60\d|xoom[2 ]{0,2}) build\//i,[`Motorola`,0]],[/droid.+; ([a-z]?\d[0-2]{2}[a-z]{2}|[c-g]\d{4}|so[-gl]\w+|xq-[a-z]{2}\d\d)(?= bui|\))/i,[`Sony`,1]],[/sony tablet [ps]/i,[`Sony`,`Xperia Tablet`]],[/\b(?:sony)?sgp\w+(?: bui|\))/i,[`Sony`,0]],[/(sony)[-_ ]?([-\w]*)/i,[`Sony`,2]],[/\blg[-e;/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,[`LG`,1]],[/\blg-?([\d\w]+) bui/i,[`LG`,1]],[/(lm(?:-?f100[nv]?|-[\w.]+)(?= bui|\))|nexus [45])/i,[`LG`,1]],[/((?=lg)?[vl]k-?\d{3}) bui/i,[`LG`,0]],[/(lg)[-_ ]?([-\w]*)/i,[`LG`,2]],[/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,[`Nokia`,1]],[/nokia[-_ ]?(([-\w. ]*?))(?: bui|\)|;|\/)/i,[`Nokia`,1]],[/(nokia) (t[12][01])/i,[`Nokia`,2]],[/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i,[`ASUS`,1]],[/(?:asus[-_ ])?(zenfone[\w\-_ ]*)/i,[`ASUS`,1]],[/(rog[\w\-_ ]*)/i,[`ASUS`,1]],[/(asus)[-_ ]?([-\w]*)/i,[`ASUS`,2]],[/lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i,[`Lenovo`,1]],[/(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])(?: bui|;|\)|\/)/i,[`Lenovo`,1]],[/(thinkpad[\w\-_ ]*)/i,[`Lenovo`,0]],[/(kf[a-z]{2}[a-z]*)(?: bui|\))/i,[`Amazon`,1]],[/(alexa)webm/i,[`Amazon`,`Echo`]],[/(fire[\w\-_ ]*)/i,[`Amazon`,0]],[/(amazon)[-_ ]?([-\w]*)/i,[`Amazon`,2]],[/(?:blackberry|\(bb10;) (\w+)/i,[`BlackBerry`,1]],[/\b((?:bb[a-f]|st[hv])100-\d)/i,[`BlackBerry`,1]],[/(playbook);[-\w),; ]+(rim)/i,[`BlackBerry`,1]],[/(microsoft); (lumia[\w ]+)/i,[`Microsoft`,2]],[/(surface duo)/i,[`Microsoft`,`Surface Duo`]],[/(surface[\w\-_ ]*)/i,[`Microsoft`,0]],[/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,[`ZTE`,2]],[/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,[`HTC`,2]],[/(alcatel|tcl)[-_ ]?([-\w]*)/i,[1,2]],[/(meizu)[-_ ]?([-\w]*)/i,[`Meizu`,2]],[/(tecno)[-_ ]?([-\w]*)/i,[`Tecno`,2]],[/(infinix)[-_ ]?([-\w]*)/i,[`Infinix`,2]],[/(micromax)[-_ ]?([-\w]*)/i,[`Micromax`,2]],[/(lava)[-_ ]?([-\w]*)/i,[`Lava`,2]],[/(panasonic)[-_ ]?([-\w]*)/i,[`Panasonic`,2]],[/(sharp)\/?([-\w]*)/i,[`Sharp`,2]],[/(benq)[-_ ]?([-\w]*)/i,[`BenQ`,2]],[/(palm)[-_ ]?([-\w]*)/i,[`Palm`,2]],[/(vertu)[-_ ]?([-\w]*)/i,[`Vertu`,2]],[/(gionee)[-_ ]?([-\w]*)/i,[`Gionee`,2]],[/(doogee)[-_ ]?([-\w]*)/i,[`Doogee`,2]],[/(ulefone)[-_ ]?([-\w]*)/i,[`Ulefone`,2]],[/(blackview)[-_ ]?([-\w]*)/i,[`Blackview`,2]],[/(cubot)[-_ ]?([-\w]*)/i,[`Cubot`,2]],[/(umidigi)[-_ ]?([-\w]*)/i,[`UMIDIGI`,2]],[/(oukitel)[-_ ]?([-\w]*)/i,[`Oukitel`,2]],[/(fairphone)[-_ ]?([-\w]*)/i,[`Fairphone`,2]],[/(cat)[-_ ]?([-\w]*)/i,[`Cat`,2]],[/(energy)[-_ ]?([-\w]*)/i,[`Energizer`,2]],[/(land rover)[-_ ]?([-\w]*)/i,[`Land Rover`,2]],[/(shield[\w\-_ ]*)/i,[`Nvidia`,0]],[/(crkey)/i,[`Google`,`Chromecast`]],[/(roku)[\dx]*/i,[`Roku`,0]],[/(apple)[-_ ]?tv/i,[`Apple`,`TV`]],[/(amazon)[-_ ]?tv/i,[`Amazon`,`Fire TV`]],[/(google)[-_ ]?tv/i,[`Google`,`TV`]],[/(smart[\w\-_ ]*tv)/i,[0,`Smart TV`]],[/(playstation[\w\-_ ]*)/i,[`Sony`,0]],[/(nintendo[\w\-_ ]*)/i,[`Nintendo`,0]],[/(xbox[\w\-_ ]*)/i,[`Microsoft`,0]],[/(googlebot)/i,[`Google`,`Bot`]],[/(bingbot)/i,[`Microsoft`,`Bing Bot`]],[/(yandexbot)/i,[`Yandex`,`Bot`]],[/(slackbot)/i,[`Slack`,`Bot`]],[/(twitterbot)/i,[`Twitter`,`Bot`]],[/(facebookbot)/i,[`Facebook`,`Bot`]],[/(linkedinbot)/i,[`LinkedIn`,`Bot`]],[/(tesla)[-_ ]?([-\w]*)/i,[`Tesla`,2]],[/(raspberry[\w\-_ ]*)/i,[`Raspberry Pi`,0]]]){let r=e.match(t);if(r){let e=n[0],t=n[1],i=typeof e==`number`?r[e]===void 0?`Unknown`:this.normalizeVendorName(r[e]):this.normalizeVendorName(e),a=`Unknown`;typeof t==`number`?a=r[t]===void 0?`Unknown`:r[t]:t===void 0?r[1]===void 0?r[0]!==void 0&&(a=r[0]):a=r[1]:a=t,a=this.normalizeModelName(a,i),this.details.vendor=i,this.details.model=a;break}}}catch(e){console.error(`DeviceChecker: device details detection error - `,e)}}normalizeVendorName(e){return e?{apple:`Apple`,samsung:`Samsung`,google:`Google`,xiaomi:`Xiaomi`,huawei:`Huawei`,oneplus:`OnePlus`,oppo:`OPPO`,vivo:`Vivo`,realme:`Realme`,motorola:`Motorola`,sony:`Sony`,lg:`LG`,nokia:`Nokia`,asus:`ASUS`,lenovo:`Lenovo`,amazon:`Amazon`,blackberry:`BlackBerry`,microsoft:`Microsoft`,zte:`ZTE`,htc:`HTC`,alcatel:`Alcatel`,tcl:`TCL`,meizu:`Meizu`,tecno:`Tecno`,infinix:`Infinix`,micromax:`Micromax`,lava:`Lava`,panasonic:`Panasonic`,sharp:`Sharp`,benq:`BenQ`,palm:`Palm`,honor:`Honor`,nvidia:`NVIDIA`,roku:`Roku`}[e.toLowerCase()]||e.charAt(0).toUpperCase()+e.slice(1).toLowerCase():`Unknown`}normalizeModelName(e,t){if(!e||e===`Unknown`)return e;if(e===`0`)return`Unknown`;let n=e.replace(/^build\//i,``).replace(/\s+bui$/i,``).replace(/\)$/,``).replace(/[;,)]/g,``).replace(/\s*\(.*?\)\s*/g,``).trim(),r=t.toLowerCase();return r.includes(`samsung`)?n=n.replace(/^(sm-|gt-|sgh-|sch-)/i,``):r.includes(`xiaomi`)?n=n.replace(/^(mi[\s\-_]*|redmi[\s\-_]*)/i,``):r.includes(`oneplus`)?n=n.replace(/^oneplus[\s\-_]*/i,``):r.includes(`google`)&&(n=n.replace(/^(pixel[\s\-_]*|nexus[\s\-_]*)/i,``)),n=n.replace(/_/g,` `).replace(/-/g,` `).replace(/\s+/g,` `).trim(),n?(n.length>0&&/^[a-z]/.test(n)&&(n=n.charAt(0).toUpperCase()+n.slice(1)),n):`Unknown`}detectIOSVersion(){try{let e=Ae();if(!je(e))return;if(this._highEntropyValues.platformVersion){let e=this._highEntropyValues.platformVersion.split(`.`).slice(0,2).join(`.`);this._iosVersion=parseFloat(e);return}if(this._os.version!==`Unknown`){let e=this._os.version.split(`.`),t=e.length>=2?`${e[0]}.${e[1]}`:e[0];this._iosVersion=parseFloat(t);return}let t=e.navigator.userAgent.match(/OS (\d+(_\d+)?)/i);t?.[1]&&(this._iosVersion=parseFloat(t[1].replace(/_/g,`.`)))}catch(e){console.error(`DeviceChecker: iOS version detection error - `,e)}}}import{getWindow as Pe,isBrowserWindow as Fe}from"@vkontakte/videoplayer-shared";var Ie=[`rec2020`,`p3`,`srgb`],Le=[`standalone`,`minimal-ui`,`fullscreen`,`window-controls-overlay`,`picture-in-picture`];class Re{_maxTouchPoints;_height;_width;_isHdr;_pixelRatio;_screenHeight;_screenWidth;_colorDepth;_colorGamut;_displayMode=`browser`;_isStandalone=!1;get isTouch(){return typeof this._maxTouchPoints==`number`?this._maxTouchPoints>1:`ontouchstart`in Pe()}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}get colorGamut(){return this._colorGamut}get displayMode(){return this._displayMode}get isStandalone(){return this._isStandalone}detect(){let e=Pe();if(!Fe(e))return;let{navigator:t,screen:n}=e,{maxTouchPoints:r}=t;try{this._maxTouchPoints=r??0,this._isHdr=!!e.matchMedia(`(dynamic-range: high)`)?.matches,this._colorDepth=n.colorDepth,this._colorGamut=this.detectColorGamut(e)}catch(e){console.error(e)}try{this._pixelRatio=e.devicePixelRatio||1,this._height=n.height,this._width=n.width,this._height=n.height,this._screenHeight=this._height*this._pixelRatio,this._screenWidth=this._width*this._pixelRatio}catch(e){console.error(e)}try{this._displayMode=this.detectDisplayMode(e);let n=t.standalone===!0;this._isStandalone=n||this._displayMode!==`browser`}catch(e){console.error(e)}}detectColorGamut(e){return Ie.find(t=>e.matchMedia?.(`(color-gamut: ${t})`)?.matches)}detectDisplayMode(e){return Le.find(t=>e.matchMedia?.(`(display-mode: ${t})`)?.matches)??`browser`}}import{getWindow as ze,isBrowserWindow as Be}from"@vkontakte/videoplayer-shared";var Ve=()=>window.ManagedMediaSource||window.MediaSource,He=()=>!!(window.ManagedMediaSource&&window.ManagedSourceBuffer?.prototype?.appendBuffer),Ue=()=>!!(window.MediaSource&&window.SourceBuffer?.prototype?.appendBuffer),We=()=>window.ManagedMediaSource?new ManagedMediaSource:new MediaSource,Ge=ze().document?.createElement(`video`),Ke=`video/mp4; codecs="avc1.42000a,mp4a.40.2"`,qe=`video/mp4; codecs="hev1.1.6.L93.B0"`,Je=`video/webm; codecs="vp09.00.10.08"`,Ye=`video/webm; codecs="av01.0.00M.08"`,Xe=`audio/mp4; codecs="mp4a.40.2"`,Ze=`audio/webm; codecs="opus"`,Qe;(async()=>{let e=ze();if(!Be(e)||!(`mediaCapabilities`in e.navigator))return;let t={type:`media-source`,video:{contentType:`video/webm`,width:1280,height:720,bitrate:1e6,framerate:30}},[n,r]=await Promise.all([e.navigator.mediaCapabilities.decodingInfo({...t,video:{...t.video,contentType:Ye}}),e.navigator.mediaCapabilities.decodingInfo({...t,video:{...t.video,contentType:Je}})]);Qe={DASH_WEBM_AV1:n,DASH_WEBM:r}})().catch(e=>{console.log(Ge),console.error(e)});class $e{_video;_deviceChecker;_browserChecker;_protocols;_containers;_codecs;_nativeHlsSupported;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 Qe}get supportedCodecs(){return Object.keys(this._codecs).filter(e=>this._codecs[e])}get nativeHlsSupported(){return this._nativeHlsSupported}detect(){let e=ze();if(!Be(e))return;let t=e.document;this._video=t.createElement(`video`);try{this._protocols={mms:He(),mse:Ue(),hls:!!(this._video.canPlayType?.(`application/x-mpegurl`)||this._video.canPlayType?.(`vnd.apple.mpegURL`)),webrtc:!!e.RTCPeerConnection,ws:!!e.WebSocket},this._containers={mp4:!!this._video.canPlayType?.(`video/mp4`),webm:!!this._video.canPlayType?.(`video/webm`),cmaf:!0};let t=!!Ve()?.isTypeSupported?.(Ke),n=!!Ve()?.isTypeSupported?.(qe),r=!!Ve()?.isTypeSupported?.(Xe);this._codecs={h264:t,h265:n,vp9:!!Ve()?.isTypeSupported?.(Je),av1:!!Ve()?.isTypeSupported?.(Ye),aac:r,opus:!!Ve()?.isTypeSupported?.(Ze),mpeg:(t||n)&&r},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}}import{getWindow as et,isBrowserWindow as tt}from"@vkontakte/videoplayer-shared";var nt=`audio/mpeg`;class rt{_audio;_containers;_codecs;supportMp3(){return this._codecs.mp3&&this._containers.mpeg}detect(){let e=et();if(!tt(e))return;let t=e.document;this._audio=t.createElement(`audio`);try{this._containers={mpeg:!!this._audio.canPlayType?.(nt)},this._codecs={mp3:!!Ve()?.isTypeSupported?.(nt)}}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}}class it{isInited$=new Ee(!1);_displayChecker;_deviceChecker;_browserChecker;_videoChecker;_audioChecker;constructor(){this._displayChecker=new Re,this._deviceChecker=new Ne(this._displayChecker),this._browserChecker=new ke,this._videoChecker=new $e(this._deviceChecker,this._browserChecker),this._audioChecker=new rt,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(){Te()&&(this._displayChecker.detect(),this._deviceChecker.detect(),this._browserChecker.detect(),this._videoChecker.detect(),this._audioChecker.detect(),this.isInited$.next(!0))}}var M=new it,at=(e,t=!1)=>{let{containers:n,protocols:r,codecs:i,nativeHlsSupported:a}=M.video,{isMobile:o}=M.device,s=M.device.isMac&&M.browser.isSafari,c=t&&!o&&!s,l=(i.h264||i.h265)&&i.aac,u=r.mse||r.mms;return e.filter(e=>{switch(e){case`DASH_SEP`:return u&&n.mp4&&l;case`DASH_WEBM`:return u&&n.webm&&i.vp9&&i.opus;case`DASH_WEBM_AV1`:return u&&n.webm&&i.av1&&i.opus;case`DASH_STREAMS`:return u&&(n.mp4&&l||n.webm&&(i.vp9||i.av1)&&(i.opus||i.aac));case`DASH_LIVE`:return u&&n.mp4&&l;case`DASH_LIVE_CMAF`:return u&&n.mp4&&l&&n.cmaf;case`DASH_ONDEMAND`:return u&&n.mp4&&l;case`HLS`:case`HLS_ONDEMAND`:case`HLS_FMP4`:case`HLS_LIVE`:case`HLS_LIVE_CMAF`:return a&&!c;case`MPEG`:return n.mp4;case`DASH`:case`DASH_LIVE_WEBM`:return!1;case`WEB_RTC_LIVE`:return r.webrtc&&r.ws&&i.h264&&(n.mp4||n.webm);default:return we(e)}})},ot=e=>{switch(e){case`MPEG`:case`DASH`:case`DASH_SEP`:case`DASH_ONDEMAND`:case`DASH_WEBM`:case`DASH_WEBM_AV1`:case`DASH_STREAMS`:case`HLS`:case`HLS_FMP4`: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 we(e)}},st=(e,t=!1)=>at(Object.keys(e).filter(e=>!ot(e)),t).length>0;class ct{subscription=new ae;log;params;sessionId$=new oe(null);mediaSessionId$=new oe(null);contentId$=new oe(null);progressTicker;isMobile=Me();mobileVolumeState={muted:!1,volume:0};media=null;lastRequestedVolume=null;constructor(e){this.params=e,this.progressTicker=new Ce(e),this.log=this.params.dependencies.logger.createComponentLog(`ChromecastPresentationApiProvider`),this.log({message:`constructor, format: ${e.format}`}),this.params.output.isLive$.next(ot(e.format)),this.subscribe()}subscribe(){let e=e=>{this.params.output.error$.next({category:D.WTF,id:`ChromecastPresentationApiProvider`,message:e?.message??`Unknown error`,thrown:e})};this.subscription.add(this.params.chromecastConnector.message$.pipe(O(e=>!!e)).subscribe(e=>{this.handleMessage(e)},e)),this.subscription.add(this.sessionId$.pipe(O(ne),te(),E(0)).subscribe(()=>{this.loadMedia()},e));let t=this.contentId$.pipe(te(),ie(Boolean));this.subscription.add(T({seekState:this.params.desiredState.seekState.stateChangeEnded$,mediaLoaded:t}).pipe(O(({mediaLoaded:e})=>e)).subscribe(()=>{let e=this.params.desiredState.seekState.getState();e.state===`requested`&&this.seek(e.position/1e3)},e));let n=T({playbackState:this.params.desiredState.playbackState.stateChangeStarted$,mediaLoaded:t});this.subscription.add(n.pipe(O(({mediaLoaded:e})=>e),E(0)).subscribe(()=>{this.syncPlayback()},e)),this.subscription.add(n.pipe(O(({mediaLoaded:e,playbackState:{from:t,to:n}})=>!e&&t===`stopped`&&n===`playing`)).subscribe(()=>{this.loadMedia()},e)),this.subscription.add(T({volumeState:this.params.desiredState.volume.stateChangeStarted$.pipe(E(30)),mediaLoaded:t}).pipe(O(({mediaLoaded:e})=>e)).subscribe(({volumeState:e})=>{let{muted:t,volume:n}=e.to;this.setVolume(n,t)},e))}handleMessage(e){switch(e.type){case`new_session`:case`update_session`:{this.sessionId$.next(e.message.sessionId);let t=e.message?.media?.[0];this.syncMediaState(t);let n=e.message?.receiver.volume;this.syncVolumeState(n)}break;case`v2_message`:switch(e.message?.type){case`MEDIA_STATUS`:{let t=e.message?.status?.[0];this.syncMediaState(t);break}}break}}loadMedia(){let e=ge(this.params),t=this.media?.currentTime,n=this.params.desiredState.seekState.getState(),r=t??(n.state===`none`?0:n.position/1e3),i=this.params.desiredState.playbackState.getState()===`playing`;this.params.chromecastConnector.sendV2Message({type:`LOAD`,requestId:0,media:e,autoplay:i,currentTime:r,customData:null,activeTrackIds:null}),this.params.output.willSeekEvent$.next()}stop(){this.params.chromecastConnector.stopMedia()}play(){let e=this.mediaSessionId$.getValue();w(e,`play on null mediaSessionId`),this.params.chromecastConnector.sendV2Message({type:`PLAY`,mediaSessionId:e,customData:null})}pause(){let e=this.mediaSessionId$.getValue();w(e,`pause on null mediaSessionId`),this.params.chromecastConnector.sendV2Message({type:`PAUSE`,mediaSessionId:e,customData:null})}seek(e){let t=this.mediaSessionId$.getValue();w(t,`seek on null mediaSessionId`),this.params.chromecastConnector.sendV2Message({type:`SEEK`,currentTime:e,mediaSessionId:t}),this.params.output.willSeekEvent$.next()}setVolume(e,t){let n=e,r=`[setVolume] volume: ${e}, muted: ${t}`;this.isMobile&&(n=this.mobileVolumeState.volume,r+=`, mobile next volume: ${n}`),this.log({message:r}),this.lastRequestedVolume={volume:n,muted:t},this.params.chromecastConnector.sendV2Message({type:`SET_VOLUME`,requestId:0,volume:{level:t?0:n,muted:t?!0:null}})}syncPlaybackState({playerState:e,idleReason:t}){let n=this.params.output.isBuffering$.getValue(),r=e===`BUFFERING`;switch(n!==r&&this.params.output.isBuffering$.next(r),e){case`PAUSED`:A(this.params.desiredState.playbackState,`paused`);break;case`PLAYING`:A(this.params.desiredState.playbackState,`playing`);break;case`IDLE`:t===`FINISHED`?(this.params.output.endedEvent$.next(),A(this.params.desiredState.playbackState,`stopped`),this.contentId$.next(null)):A(this.params.desiredState.playbackState,`ready`);break;case`BUFFERING`:break}}syncPlayback(){let e=this.params.desiredState.playbackState.getState();switch(this.log({message:`[syncPlayback] ${e}`}),e){case`ready`:break;case`playing`:this.play();break;case`paused`:this.pause();break;case`stopped`:this.stop();break}}syncMediaState=e=>{if(re(e))return;this.media=e,this.mediaSessionId$.next(e.mediaSessionId??null);let t=e.media?.contentId;t&&this.contentId$.next(t),this.syncPlaybackState(e);let n=e.media?.duration;ne(n)&&this.params.output.duration$.next(Math.max(0,n));let r=e.currentTime;if(ne(r)){this.params.desiredState.seekState.getState().state===`applying`&&this.params.output.seekedEvent$.next(),this.params.output.position$.next(r);let t=this.params.output.isLive$.getValue();e.playerState===`PLAYING`&&!t?this.progressTicker.start(r):this.progressTicker.pause()}};syncVolumeState(e){if(re(e))return;let{level:t,muted:n}=e,r={muted:n??!1,volume:t??0};this.lastRequestedVolume&&=(n&&(r.volume=this.lastRequestedVolume.volume),this.lastRequestedVolume.muted&&!t&&!n&&(r.volume=this.lastRequestedVolume.volume,r.muted=!0),null);let i=`[syncVolumeState] volume: ${r.volume}, muted: ${r.muted}`;this.isMobile&&(this.mobileVolumeState.volume=r.volume,this.mobileVolumeState.muted=r.muted,r.volume=this.params.output.volume$.getValue().volume,i+=`, volume passed to state machine: ${r.volume}`),this.log({message:i}),this.params.output.volume$.next(r)}destroy(){this.progressTicker.destroy(),this.subscription.unsubscribe()}}import{assertNonNullable as lt,ErrorCategory as ut,filter as dt,Subject as ft,Subscription as pt,tap as mt,ValueSubject as ht,fromEvent as gt,getWindow as _t}from"@vkontakte/videoplayer-shared";var vt=e=>({castDevice:{friendlyName:e},remotePlayer:{},remotePlayerController:{},session:{}}),yt=()=>String(Date.now())+String(Math.floor(Math.random()*1e5));class bt{params;clientId;capabilities=[`WEB`];presentationRequest$=new ht(null);log;sessionId$=new ht(null);broadcastChannel=new BroadcastChannel(`vk_player_chromecast_events`);subscription=new pt;subscriptionEvents=new pt;isDestroyed=!1;sequenceNumber=0;presentationAvailable$=new ht(!1);presentationConnection$=new ht(null);message$=new ht(null);friendlyName$=new ht(null);errorEvent$=new ft;constructor(e){this.clientId=this.getClientId(),this.params=e,this.log=e.logger.createComponentLog(`ChromecastPresentationApiConnector`),this.log({message:`constructor`}),this.safeReinitPresentation(),this.subscribe()}destroy(){this.log({message:`destroy`}),this.subscription.unsubscribe(),this.subscriptionEvents.unsubscribe(),this.broadcastChannel.close(),this.isDestroyed=!0}disconnect(e=!0){this.log({message:`disconnect`}),e&&this.stopMedia(),this.presentationRequest$.next(null);let t=this.presentationConnection$.getValue();t&&t.close(),this.presentationConnection$.next(null),this.friendlyName$.next(null),this.resetSequenceNumber(),this.resetSubscriptionEvents()}stopMedia(){this.log({message:`stopMedia`}),this.sendV2Message({type:`STOP`})}reinitPresentation(e=!0){let t=this.createCastUrl(),n=new PresentationRequest(t);this.presentationRequest$.next(n),this.log({message:`PresentationRequest created`}),n.getAvailability().then(e=>{let t=()=>{this.log({message:`PresentationRequest presentation availability: ${e.value}`}),this.presentationAvailable$.next(e.value)};this.subscriptionEvents.add(gt(e,`change`).subscribe(()=>{t()})),t()}).catch(()=>{this.presentationAvailable$.next(!0)}),_t().navigator.presentation.defaultRequest=n,e&&n.reconnect(`auto-join`).then(e=>{this.log({message:`PresentationRequest reconnect success`}),this.handleConnection(e)}).catch(()=>{this.log({message:`PresentationRequest reconnect failed`})})}safeReinitPresentation(e){try{this.reinitPresentation(e)}catch(e){this.errorEvent$.next({category:ut.WTF,id:`ChromecastPresentationApiConnector`,message:e?.message??`reinitPresentation error`,thrown:e})}}async connect(){this.log({message:`connect`});try{this.presentationRequest$.getValue()||(this.log({message:`reinitPresentation`}),this.reinitPresentation(!1));let e=this.presentationRequest$.getValue();lt(e,`connect with null presentationRequest`);let t=await e.start();this.handleConnection(t)}catch(e){switch(e?.name){case`AbortError`:case`NotAllowedError`:break;default:this.errorEvent$.next({category:ut.WTF,id:`ChromecastPresentationApiConnector`,message:e?.message??`connect error`,thrown:e});break}}}subscribe(){this.subscription.add(gt(this.broadcastChannel,`message`).subscribe(e=>{this.log({message:`broadcast connection data: ${e.data}`}),e.data===`connection`&&this.disconnect(!1)})),this.subscription.add(this.presentationAvailable$.subscribe(e=>{this.log({message:`presentationAvailable$: ${e}`})})),this.subscription.add(this.presentationConnection$.pipe(mt(e=>{this.log({message:`presentationConnection$: ${!!e}`})}),dt(e=>!!e)).subscribe(e=>{let t=gt(e,`message`).subscribe(e=>{let t=JSON.parse(e.data);t.clientId===this.clientId&&(this.log({message:`[onmessage] ${e.data}`}),this.handleMessage(t),this.message$.next(t))}),n=gt(e,`connect`).subscribe(()=>{this.send(`client_connect`)}),r=gt(e,`close`).subscribe(e=>{switch(e.reason){case`error`:this.errorEvent$.next({category:ut.WTF,id:`ChromecastPresentationApiConnector`,message:`Session error`,thrown:e});break;case`closed`:break}});this.subscriptionEvents.add(t),this.subscriptionEvents.add(n),this.subscriptionEvents.add(r)}))}send(e){switch(e){case`client_connect`:{let e={type:`client_connect`,message:this.clientId,sequenceNumber:-1,timeoutMillis:0,clientId:this.clientId};this.safeSend(JSON.stringify(e));break}}}sendV2Message(e){let t=this.sessionId$.getValue();if(t){let n={type:`v2_message`,sequenceNumber:this.getSequenceNumber(),timeoutMillis:0,clientId:this.clientId,message:{...e,sessionId:t}};this.safeSend(JSON.stringify(n))}}safeSend(e){try{this.log({message:`[send] ${e}`});let t=this.presentationConnection$.getValue();t?.state===`connected`&&t?.send(e)}catch(t){this.errorEvent$.next({category:ut.WTF,id:`ChromecastPresentationApiConnector`,message:`PresentationConnection send error`,data:{message:e},thrown:t})}}handleMessage(e){switch(e.type){case`new_session`:case`update_session`:this.sessionId$.next(e.message.sessionId),this.friendlyName$.next(e.message.receiver.friendlyName||`Chromecast Device`);break;case`receiver_action`:e.message?.action===`stop`&&this.disconnect();break}}createCastUrl(){return`cast:${this.params.appId}?clientId=${this.clientId}&autoJoinPolicy=tab_and_origin_scoped&defaultActionPolicy=create_session&launchTimeout=60000&supportedAppTypes=${this.capabilities}&appParams=%7B%22launchCheckerParams%22%3A%7B%7D%7D`}getSequenceNumber(){let e=this.sequenceNumber;return this.sequenceNumber=(this.sequenceNumber+1)%(2**53-1),e}resetSequenceNumber(){this.sequenceNumber=0}getClientId(){let e=`__vk_player_chromecast_id`;return _t()[e]=_t()[e]||yt()}resetSubscriptionEvents(){this.subscriptionEvents.unsubscribe(),this.subscriptionEvents=new pt}handleConnection(e){this.log({message:`connection available`}),this.isDestroyed?(this.log({message:`connected on already destroyed component`}),e.close()):(this.broadcastChannel.postMessage(`connection`),this.presentationConnection$.next(e))}}import{ValueSubject as xt,Subject as St,map as Ct,Subscription as wt,combine as Tt,filterChanged as Et,assertNonNullable as Dt}from"@vkontakte/videoplayer-shared";class Ot{subscription=new wt;log;contentId;connection$=new xt(void 0);castState$=new xt(`NOT_AVAILABLE`);errorEvent$=new St;chromecastConnector;static isSupported(){return`chrome`in window&&`presentation`in navigator&&`BroadcastChannel`in window}constructor(e){let t=Ot.isSupported();this.log=e.dependencies.logger.createComponentLog(`ChromecastPresentationApiInitializer`),this.log({message:`[constructor] receiverApplicationId: ${e.receiverApplicationId}, isDisabled: ${e.isDisabled}, isSupported: ${t}`}),!(!t||e.isDisabled||!e.receiverApplicationId)&&(this.chromecastConnector=new bt({appId:e.receiverApplicationId,logger:e.dependencies.logger}),this.subscribe())}subscribe(){Dt(this.chromecastConnector,`subscribe with null chromecastConnector`),this.subscription.add(this.chromecastConnector.errorEvent$.subscribe(this.errorEvent$));let e=Tt({connection:this.chromecastConnector.presentationConnection$,available:this.chromecastConnector.presentationAvailable$,friendlyName:this.chromecastConnector.friendlyName$.pipe(Et())});this.subscription.add(e.pipe(Ct(({connection:e,friendlyName:t})=>!!(e&&t)),Et()).subscribe(e=>{let t=this.chromecastConnector?.friendlyName$.getValue()??``;this.connection$.next(e?vt(t):void 0)})).add(e.subscribe(({available:e,connection:t})=>{e?t?this.castState$.next(`CONNECTED`):this.castState$.next(`AVAILABLE`):this.castState$.next(`NOT_AVAILABLE`)}))}connect(){this.log({message:`connect`}),this.chromecastConnector?.connect()}disconnect(){this.log({message:`disconnect`}),this.chromecastConnector?.disconnect()}async stopMedia(){this.log({message:`stopMedia`}),this.chromecastConnector?.stopMedia()}toggleConnection(){let e=!!this.chromecastConnector?.presentationConnection$.getValue();this.log({message:`toggleConnection: isConnected - ${e}`}),e?this.disconnect():this.connect()}setVolume(e){}setMuted(e){}destroy(){this.log({message:`destroy`}),this.chromecastConnector?.destroy(),this.subscription.unsubscribe()}}import{isNonNullable as kt,Subject as At,merge as jt}from"@vkontakte/videoplayer-shared";var Mt=(e,t)=>e===t;class Nt{comparator;state;prevState;transition;transitionStarted$=new At;transitionEnded$=new At;transitionUpdated$=new At;forceChanged$=new At;stateChangeStarted$=jt(this.transitionStarted$,this.transitionUpdated$);stateChangeEnded$=jt(this.transitionEnded$,this.forceChanged$);constructor(e,t=Mt){this.comparator=t,this.state=e,this.prevState=void 0}setState(e){let t=this.transition,n=this.state;this.transition=void 0,this.prevState=n,this.state=e,t?this.comparator(t.to,e)?this.transitionEnded$.next(t):this.forceChanged$.next({from:t.from,to:e,canceledTransition:t}):this.forceChanged$.next({from:n,to:e,canceledTransition:t})}startTransitionTo(e){let t=this.transition,n=this.state;this.comparator(n,e)||kt(t)&&this.comparator(t.to,e)||(this.prevState=n,this.state=e,t?(this.transition={from:t.from,to:e,canceledTransition:t},this.transitionUpdated$.next(this.transition)):(this.transition={from:n,to:e},this.transitionStarted$.next(this.transition)))}getTransition(){return this.transition}getState(){return this.state}getPrevState(){return this.prevState}}import{assertNever as Pt,debounce as Ft,ErrorCategory as It,fromEvent as Lt,map as Rt,merge as zt,observableFrom as Bt,Subject as Vt,Subscription as Ht,timeout as Ut}from"@vkontakte/videoplayer-shared";var Wt=5,Gt=5,Kt=500,qt=7e3;class Jt{subscription=new Ht;loadMediaTimeoutSubscription=new Ht;videoState=new Nt(`stopped`);params;log;constructor(e){this.params=e,this.log=this.params.dependencies.logger.createComponentLog(`ChromecastProvider`),this.log({message:`constructor, format: ${e.format}`}),this.params.output.isLive$.next(ot(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 Ht;this.subscription.add(e),this.subscription.add(zt(this.videoState.stateChangeStarted$.pipe(Rt(e=>`stateChangeStarted$ ${JSON.stringify(e)}`)),this.videoState.stateChangeEnded$.pipe(Rt(e=>`stateChangeEnded$ ${JSON.stringify(e)}`))).subscribe(e=>this.log({message:`[videoState] ${e}`})));let t=(e,t)=>this.subscription.add(e.subscribe(t));if(this.params.output.isLive$.getValue())this.params.output.position$.next(0),this.params.output.duration$.next(0);else{let t=new Vt;e.add(t.pipe(Ft(Kt)).subscribe(()=>{this.params.output.seekedEvent$.next()}));let n=NaN;e.add(Lt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.CURRENT_TIME_CHANGED).subscribe(e=>{this.logRemoteEvent(e);let r=e.value;this.params.output.position$.next(r),(this.params.desiredState.seekState.getState().state===`applying`||Math.abs(r-n)>Wt)&&t.next(r),n=r})),e.add(Lt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.DURATION_CHANGED).subscribe(e=>{this.logRemoteEvent(e),this.params.output.duration$.next(e.value)}))}t(Lt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MEDIA_LOADED_CHANGED),t=>{this.logRemoteEvent(t),t.value?this.handleRemoteReady():(this.handleRemoteStop(),e.unsubscribe())}),t(Lt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED),e=>{this.logRemoteEvent(e),e.value?this.handleRemotePause():this.handleRemotePlay()}),t(Lt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.PLAYER_STATE_CHANGED),e=>{this.logRemoteEvent(e);let{remotePlayer:t}=this.params.connection,n=e.value,r=this.params.output.isBuffering$.getValue(),i=n===chrome.cast.media.PlayerState.BUFFERING;switch(r!==i&&this.params.output.isBuffering$.next(i),n){case chrome.cast.media.PlayerState.IDLE:!this.params.output.isLive$.getValue()&&t.duration-t.currentTime<Gt&&this.params.output.endedEvent$.next(),this.handleRemoteStop(),A(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:Pt(n)}}),t(Lt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED),e=>{this.logRemoteEvent(e),this.handleRemoteVolumeChange({volume:e.value})}),t(Lt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED),e=>{this.logRemoteEvent(e),this.handleRemoteVolumeChange({muted:e.value})}),t(zt(this.params.desiredState.playbackState.stateChangeStarted$,this.params.desiredState.seekState.stateChangeEnded$,this.videoState.stateChangeEnded$,Bt([`init`])).pipe(Ft(0)),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`),A(this.params.desiredState.playbackState,`paused`)):(this.videoState.setState(`playing`),A(this.params.desiredState.playbackState,`playing`));let e=this.params.output.isLive$.getValue();this.params.output.duration$.next(e?0:t.duration),this.params.output.position$.next(e?0:t.currentTime),this.params.desiredState.seekState.setState({state:`none`})}}prepare(){let e=this.params.format;this.log({message:`[prepare] format: ${e}`});let t=ge(this.params),n=this.createLoadRequest(t);this.loadMedia(n)}handleRemotePause(){let e=this.videoState.getState();(this.videoState.getTransition()?.to===`paused`||e===`playing`)&&(this.videoState.setState(`paused`),A(this.params.desiredState.playbackState,`paused`))}handleRemotePlay(){let e=this.videoState.getState();(this.videoState.getTransition()?.to===`playing`||e===`paused`)&&(this.videoState.setState(`playing`),A(this.params.desiredState.playbackState,`playing`))}handleRemoteReady(){this.videoState.getTransition()?.to===`ready`&&this.videoState.setState(`ready`),this.params.desiredState.playbackState.getTransition()?.to===`ready`&&A(this.params.desiredState.playbackState,`ready`)}handleRemoteStop(){this.videoState.getState()!==`stopped`&&this.videoState.setState(`stopped`)}handleRemoteVolumeChange(e){let t=this.params.output.volume$.getValue(),n={volume:e.volume??t.volume,muted:e.muted??t.muted};(n.volume!==t.volume||n.muted!==n.muted)&&this.params.output.volume$.next(n)}seek(e){this.params.output.willSeekEvent$.next();let{remotePlayer:t,remotePlayerController:n}=this.params.connection;t.currentTime=e,n.seek()}stop(){let{remotePlayerController:e}=this.params.connection;e.stop()}createLoadRequest(e){let t=new chrome.cast.media.LoadRequest(e);t.autoplay=!1;let n=this.params.desiredState.seekState.getState();return n.state===`applying`||n.state===`requested`?t.currentTime=this.params.output.isLive$.getValue()?0:n.position/1e3:t.currentTime=0,t}loadMedia(e){let t=this.params.connection.session.loadMedia(e),n=new Promise((e,t)=>{this.loadMediaTimeoutSubscription.add(Ut(qt).subscribe(()=>t(`timeout(${qt})`)))});Promise.race([t,n]).then(()=>{this.log({message:`[loadMedia] completed, format: ${this.params.format}`}),this.params.desiredState.seekState.getState().state===`applying`&&this.params.output.seekedEvent$.next(),this.handleRemoteReady()},e=>{let t=`[prepare] loadMedia failed, format: ${this.params.format}, reason: ${e}`;this.log({message:t}),this.params.output.error$.next({id:`ChromecastProvider.loadMedia`,category:It.VIDEO_PIPELINE,message:t,thrown:e})}).finally(()=>{this.loadMediaTimeoutSubscription.unsubscribe()})}logRemoteEvent(e){this.log({message:`[remoteEvent] ${JSON.stringify(e)}`})}syncPlayback=()=>{let e=this.videoState.getState(),t=this.videoState.getTransition(),n=this.params.desiredState.playbackState.getState(),r=this.params.desiredState.playbackState.getTransition(),i=this.params.desiredState.seekState.getState();if(this.log({message:`[syncPlayback] videoState: ${e}; videoTransition: ${JSON.stringify(t)}; desiredPlaybackState: ${n}; desiredPlaybackStateTransition: ${this.params.desiredState.playbackState.getTransition()}; seekState: ${JSON.stringify(i)};`}),n===`stopped`){e!==`stopped`&&(this.videoState.startTransitionTo(`stopped`),this.stop());return}if(!t){if(r?.to!==`paused`&&i.state===`requested`&&e!==`stopped`){this.seek(i.position/1e3);return}switch(n){case`ready`:switch(e){case`playing`:case`paused`:case`ready`:break;case`stopped`:this.videoState.startTransitionTo(`ready`),this.prepare();break;default:Pt(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:Pt(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:Pt(e)}break;default:Pt(n)}}}}import{clearVideoElement as Yt,fromEvent as Xt,getWindow as Zt,Subscription as Qt}from"@vkontakte/videoplayer-shared";import{clearVideoElement as $t}from"@vkontakte/videoplayer-shared";var en=e=>{try{e.pause(),e.playbackRate=0,$t(e),e.remove()}catch(e){console.error(e)}},tn=`__spvc`;class nn{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)}}var rn=Zt(),an=rn.WeakMap?new rn.WeakMap:new nn,on=rn.WeakMap?new rn.WeakMap:new Map,sn=(e,t=20)=>{let n=0;return Xt(e,`ratechange`).subscribe(r=>{n++,n>=t&&(e.currentTime=e.currentTime,n=0)})};function cn(e){e.style.position=`fixed`,e.style.left=`100%`,e.setAttribute(`data-role`,`screen`),Zt().document.body.appendChild(e)}function ln(e,t){e.style.position=``,e.style.left=``,t.appendChild(e)}var un=(e,{audioVideoSyncRate:t,disableYandexPiP:n,reuseOwnVideoElement:r,reuseOwnVideoElementOnBackgroundTabOnly:i})=>{let a,o=e.querySelector(`video`),s=!!o,c=Zt().document.querySelector(`body > video[data-role=screen]`)||void 0;r&&!i?rn[tn]=c:(c?.remove(),delete rn[tn]),o?(a=o,Yt(a)):c&&c===rn[tn]?(a=c,ln(a,e)):(a=Zt().document.createElement(`video`),e.appendChild(a),r&&!i&&(rn[tn]=a)),an.set(a,s);let l=new Qt;return l.add(sn(a,t)),on.set(a,l),a.setAttribute(`crossorigin`,`anonymous`),a.setAttribute(`playsinline`,`playsinline`),n&&a.setAttribute(`x-yandex-pip`,`false`),a.controls=!1,a.setAttribute(`poster`,`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=`),a},dn=e=>(e.setAttribute(`crossorigin`,`anonymous`),e.controls=!1,e),fn=(e,t)=>{if(e instanceof HTMLAudioElement){pn(e,t);return}if(e instanceof HTMLVideoElement){mn(e,t);return}};function pn(e,{clearAudioElementOnDispose:t}){if(t){Yt(e);return}en(e)}function mn(e,{reuseOwnVideoElement:t,reuseOwnVideoElementOnBackgroundTabOnly:n}){on.get(e)?.unsubscribe(),on.delete(e);let r=an.get(e);an.delete(e),Yt(e),t&&!n&&!r&&cn(e)}import{isNonNullable as hn,map as gn,Subject as _n,Subscription as vn,ErrorCategory as yn}from"@vkontakte/videoplayer-shared";import{isNonNullable as bn,isNullable as xn,Subscription as Sn}from"@vkontakte/videoplayer-shared";var Cn=(e,t,n,{equal:r=(e,t)=>e===t,changed$:i,onError:a}={})=>{let o=e.getState(),s=t(),c=xn(i),l=new Sn;return i&&l.add(i.subscribe(t=>{r(t,e.getState())&&e.setState(t)},a)),r(s,o)||(n(o),c&&e.setState(o)),l.add(e.stateChangeStarted$.subscribe(t=>{n(t.to),c&&e.setState(t.to)},a)),l},wn=(e,t,n)=>Cn(t,()=>e.loop,t=>{bn(t)&&(e.loop=t)},{onError:n}),Tn=(e,t,n,r,i)=>Cn(t,()=>({muted:e.muted,volume:e.volume}),t=>{i?.skipVideoElVolumeSync$.getValue()||bn(t)&&(e.muted=t.muted,e.volume=t.volume)},{equal:(e,t)=>e===t||e?.muted===t?.muted&&e?.volume===t?.volume,changed$:n,onError:r}),En=(e,t,n,r)=>Cn(t,()=>e.playbackRate,t=>{bn(t)&&(e.playbackRate=t)},{changed$:n,onError:r}),Dn=Cn;class On{available$=new _n;error$=new _n;subscription=new vn;externalTracks=new Map;internalTracks=new Map;emittedIds;connect(e,t){let n=e=>{this.error$.next({id:`TextTracksManager`,category:yn.WTF,message:`Generic TextTrackManager error`,thrown:e})};this.subscription.add(this.available$.subscribe(t.availableTextTracks$)),this.subscription.add(this.error$.subscribe(t.error$)),this.emitAvailable(),this.subscription.add(Dn(e.internalTextTracks,()=>Array.from(this.internalTracks.values()),e=>{hn(e)&&this.setInternal(e)},{equal:(e,t)=>hn(e)&&hn(t)&&e.length===t.length&&e.every(({id:e},n)=>e===t[n].id),changed$:this.available$.pipe(gn(e=>e.filter(({type:e})=>e===`internal`))),onError:n})),this.subscription.add(Dn(e.externalTextTracks,()=>Array.from(this.externalTracks.values()),e=>{hn(e)&&this.setExternal(e)},{equal:(e,t)=>hn(e)&&hn(t)&&e.length===t.length&&e.every(({id:e},n)=>e===t[n].id),changed$:this.available$.pipe(gn(e=>e.filter(({type:e})=>e===`external`))),onError:n}))}setExternal(e){this.internalTracks.clear();for(let t of Array.from(this.externalTracks.keys()))e.some(e=>e.id===t)||this.externalTracks.delete(t);for(let t of e)this.externalTracks.has(t.id)||this.externalTracks.set(t.id,t);this.emitAvailable()}setInternal(e){let t=Array.from(this.externalTracks.values());for(let t of Array.from(this.internalTracks.keys()))e.some(e=>e.id===t)||this.internalTracks.delete(t);for(let n of e){let e=t.some(({language:e,isAuto:t})=>e===n.language&&t===n.isAuto);!this.internalTracks.has(n.id)&&!e&&this.internalTracks.set(n.id,n)}this.emitAvailable()}destroy(){this.subscription.unsubscribe(),this.externalTracks.clear(),this.internalTracks.clear()}emitAvailable(){let e=[...this.externalTracks.values(),...this.internalTracks.values()],t=e.map(({id:e})=>e),{emittedIds:n}=this;n&&n.length===t.length&&n.every((e,n)=>e===t[n])||(this.emittedIds=t,this.available$.next(e.map(e=>({...e,isAuto:e.isAuto??e.id.includes(`auto`)}))))}}var kn=On;class An{pausedTime=0;streamOffset=0;pauseTimestamp=0;getTotalPausedTime(){return this.pausedTime+this.getCurrentPausedTime()}getCurrentPausedTime(){return this.pauseTimestamp>0?Date.now()-this.pauseTimestamp:0}getStreamOffset(){return this.streamOffset}getTotalOffset(){return this.getTotalPausedTime()+this.streamOffset}pause(){this.pauseTimestamp===0&&(this.pauseTimestamp=Date.now())}resume(){this.pauseTimestamp>0&&(this.pausedTime+=this.getCurrentPausedTime(),this.pauseTimestamp=0)}resetTo(e,t=!1){this.streamOffset=e,this.pauseTimestamp=0,this.pausedTime=0,t&&this.pause()}}var jn=e=>{let t=e;for(;!(t instanceof Document)&&!(t instanceof ShadowRoot)&&t!==null;)t=t?.parentNode;return t??void 0},Mn=e=>{let t=jn(e);return!!(t&&t.fullscreenElement&&t.fullscreenElement===e)},Nn=e=>{let t=jn(e);return!!(t&&t.pictureInPictureElement&&t.pictureInPictureElement===e)};import{fromEvent as N,map as Pn,merge as Fn,filterChanged as In,isNonNullable as Ln,Subject as Rn,filter as zn,mapTo as Bn,combine as Vn,once as Hn,shareReplay as P,throttle as Un,ErrorCategory as Wn,ErrorOrigin as Gn,ValueSubject as Kn,Subscription as qn}from"@vkontakte/videoplayer-shared";var Jn=3,Yn=(e,t,n=Jn)=>{let r=0,i=0;for(let a=0;a<e.length;a++){let o=e.start(a),s=e.end(a);if(o<=t&&t<=s){if(r=o,i=s,!n)return{from:r,to:i};for(let t=a-1;t>=0;t--)e.end(t)+n>=r&&(r=e.start(t));for(let t=a+1;t<e.length;t++)e.start(t)-n<=i&&(i=e.end(t))}}return{from:r,to:i}},Xn=e=>{let t=0;for(let n=0;n<e.length;n++)t+=e.end(n)-e.start(n);return t},Zn=e=>{let t=0;for(let n=0;n<e.length;n++)t+=e.end(n)-e.start(n);return t*1e3},Qn=e=>{let t=t=>N(e,t).pipe(Bn(void 0),P(1)),n=new qn,r=()=>n.unsubscribe(),i=Fn(N(e,`progress`),N(e,`timeupdate`)),a=i.pipe(Pn(()=>Yn(e.buffered,e.currentTime)),P(1)),o=i.pipe(Pn(()=>Zn(e.buffered)),P(1)),s=i.pipe(Pn(()=>e.buffered.length),P(1)),c=M.browser.isSafari?Vn({play:t(`play`).pipe(Hn()),playing:t(`playing`)}).pipe(Bn(void 0),P(1)):t(`playing`),l=N(e,`volumechange`).pipe(Pn(()=>({muted:e.muted,volume:e.volume})),P(1)),u=N(e,`ratechange`).pipe(Pn(()=>e.playbackRate),P(1)),d=N(e,`error`).pipe(zn(()=>!!(e.error||e.played.length)),Pn(()=>{let t=e.error;return{id:t?`MediaError#${t.code}`:`HtmlVideoError`,category:Wn.VIDEO_PIPELINE,message:t?t.message:`Error event from HTML video element`,thrown:e.error??void 0,origin:Gn.MediaError,data:t?{code:t.code}:void 0}}),P(1)),f=N(e,`timeupdate`).pipe(Pn(()=>e.currentTime),P(1)),p=Fn(N(e,`loadedmetadata`),N(e,`timeupdate`),N(e,`pause`),N(e,`seeked`),N(e,`ended`)).pipe(Pn(()=>Xn(e.played)),In(),P(1)),m=[`waiting`,`seeking`,`seeked`,`timeupdate`],h=new Rn,g=.3,_;n.add(Fn(...m.map(t=>N(e,t))).subscribe(t=>{let n=e.currentTime;e.loop&&Ln(_)&&Ln(n)&&_>=e.duration-g&&n<=g&&h.next(_),_=n}));let v=t(`pause`).pipe(zn(()=>!e.error&&_!==e.duration),P(1)),y=N(e,`enterpictureinpicture`).pipe(P(1)),b=N(e,`leavepictureinpicture`).pipe(P(1)),x=new Kn(Nn(e));n.add(y.subscribe(()=>x.next(!0))),n.add(b.subscribe(()=>x.next(!1)));let S=new Kn(Mn(e)),C=N(e,`fullscreenchange`).pipe(P(1));n.add(C.pipe(Pn(()=>Mn(e))).subscribe(S));let ee=N(e,`timeupdate`).pipe(Pn(t=>e.duration-e.currentTime<.1),In(),P(1)),w=Fn(ee.pipe(zn(t=>!e.loop&&t)),N(e,`ended`)).pipe(Un(1e3),Bn(void 0),P(1)),T=Fn(...[`waiting`,`pause`,`canplay`,`play`,`canplaythrough`,`playing`,`seeking`,`seeked`,`ended`].map(t=>N(e,t)),ee.pipe(Pn(e=>({type:e?`ended`:`unknown`})))).pipe(Pn(t=>M.browser.isFirefox&&t.type===`ended`?e.readyState<2:e.readyState<3),In(),P(1));return{playing$:c,pause$:v,canplay$:t(`canplay`),ended$:w,looped$:h,error$:d,seeked$:t(`seeked`),seeking$:t(`seeking`),progress$:t(`progress`),loadStart$:t(`loadstart`),loadedMetadata$:t(`loadedmetadata`),loadedData$:t(`loadeddata`),timeUpdate$:f,durationChange$:N(e,`durationchange`).pipe(Pn(()=>e.duration),P(1)),playedTime$:p,isBuffering$:T,currentBuffer$:a,totalBufferDuration$:o,bufferRangeCount$:s,volumeState$:l,playbackRateState$:u,inPiP$:x,inFullscreen$:S,enterPip$:y,leavePip$:b,destroy:r}};import{VideoQuality as $n}from"@vkontakte/videoplayer-shared";var er=e=>{switch(e){case`mobile`:return $n.Q_144P;case`lowest`:return $n.Q_240P;case`low`:return $n.Q_360P;case`sd`:case`medium`:return $n.Q_480P;case`hd`:case`high`:return $n.Q_720P;case`fullhd`:case`full`:return $n.Q_1080P;case`quadhd`:case`quad`:return $n.Q_1440P;case`ultrahd`:case`ultra`:return $n.Q_2160P}};import{assertNotEmptyArray as tr,getWindow as nr,isInvariantQuality as rr,ValueSubject as ir}from"@vkontakte/videoplayer-shared";var ar=e=>`audioTracksAsc`in e;import{now as or}from"@vkontakte/videoplayer-shared";class sr{last;history={};recordSelection(e){this.history[e.id]=or()}recordSwitch(e){this.last=e}clear(){this.last=void 0,this.history={}}}import{flattenObject as cr,isInvariantQuality as lr,isLowerOrEqual as ur,isNonNullable as dr,now as fr}from"@vkontakte/videoplayer-shared";import{isLowerOrEqual as pr,isNonNullable as mr,isNullable as hr}from"@vkontakte/videoplayer-shared";var gr=(e,t)=>(e??0)/(t>0?t:1),_r=e=>`quality`in e,vr=e=>(t,n)=>e*(Number(t.bitrate)-Number(n.bitrate)),yr=e=>(t,n)=>e*(pr(t.quality,n.quality)?-1:1),br=e=>(t,n)=>_r(t)&&_r(n)?yr(e)(t,n):vr(e)(t,n),xr=(e,t)=>br(1)(e,t)<0,Sr=(e,t)=>Math.log(t)/Math.log(e),Cr=(e,t,n)=>(t-n)*2**(-10*e)+n,wr=(e,t,n,r)=>{if(hr(e))return n[0];let i=n.filter(t=>mr(t.bitrate)&&mr(e.bitrate)?e.bitrate/t.bitrate>r:!0),a=n.at(Math.round(n.length*t.indexOf(e)/(t.length+1)))??n.at(-1);return a&&i.includes(a)?a:i.length?i.at(-1):n.at(0)},Tr=(e,t)=>{if(hr(t)||hr(e))return;let n=e.get(t.id);if(!n?.length)return;let r=(n[n.length-1].time.to-n[0].time.from)/1e3;if(r<=0)return;let i=n.reduce((e,t)=>e+(t.size??1/0),0)*8/1024/r;return isFinite(i)?i:void 0},Er=(e,t)=>mr(e)&&mr(t)&&t>0&&e>0&&e<=t*2,Dr=({name:e,...t})=>`
|
|
6
|
+
var e=`2.0.181-beta.1`,t;(e=>{e.STOPPED=`stopped`,e.READY=`ready`,e.PLAYING=`playing`,e.PAUSED=`paused`})(t||={});var n;(e=>{e.MPEG=`MPEG`,e.DASH=`DASH`,e.DASH_SEP=`DASH_SEP`,e.DASH_SEP_VK=`DASH_SEP`,e.DASH_WEBM=`DASH_WEBM`,e.DASH_WEBM_AV1=`DASH_WEBM_AV1`,e.DASH_STREAMS=`DASH_STREAMS`,e.DASH_WEBM_VK=`DASH_WEBM`,e.DASH_ONDEMAND=`DASH_ONDEMAND`,e.DASH_ONDEMAND_VK=`DASH_ONDEMAND`,e.DASH_LIVE=`DASH_LIVE`,e.DASH_LIVE_CMAF=`DASH_LIVE_CMAF`,e.DASH_LIVE_WEBM=`DASH_LIVE_WEBM`,e.HLS=`HLS`,e.HLS_ONDEMAND=`HLS_ONDEMAND`,e.HLS_JS=`HLS`,e.HLS_FMP4=`HLS_FMP4`,e.HLS_LIVE=`HLS_LIVE`,e.HLS_LIVE_CMAF=`HLS_LIVE_CMAF`,e.WEB_RTC_LIVE=`WEB_RTC_LIVE`})(n||={});var r;(e=>{e.AV1=`av1`,e.VP9=`vp9`,e.AVC1=`avc1`,e.HEV1=`hev1`})(r||={});var i;(e=>{e.NOT_AVAILABLE=`NOT_AVAILABLE`,e.AVAILABLE=`AVAILABLE`,e.CONNECTING=`CONNECTING`,e.CONNECTED=`CONNECTED`})(i||={});var a;(e=>{e.HTTP1=`http1`,e.HTTP2=`http2`,e.QUIC=`quic`})(a||={});var o;(e=>{e.NONE=`none`,e.INLINE=`inline`,e.FULLSCREEN=`fullscreen`,e.SECOND_SCREEN=`second_screen`,e.PIP=`pip`,e.INVISIBLE=`invisible`})(o||={});var s;(e=>{e.TRAFFIC_SAVING=`traffic_saving`,e.HIGH_QUALITY=`high_quality`,e.UNKNOWN=`unknown`})(s||={});import{assertNever as c,assertNonNullable as l,isNonNullable as u,ValueSubject as d,Subject as f,Subscription as p,merge as m,observableFrom as h,fromEvent as g,map as _,tap as v,filterChanged as y,isNullable as b,ErrorCategory as x}from"@vkontakte/videoplayer-shared";var S=e=>new Promise((t,n)=>{let r=document.createElement(`script`);r.setAttribute(`src`,e),r.onload=()=>t(),r.onerror=e=>n(e),document.body.appendChild(r)});class C{connection$=new d(void 0);castState$=new d(`NOT_AVAILABLE`);errorEvent$=new f;contentId;realCastState$=new d(`NOT_AVAILABLE`);subscription=new p;log;params;isDestroyed=!1;constructor(e){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 n=u(window.chrome?.cast),r=!!window.__onGCastApiAvailable;n?this.initializeCastApi():(window.__onGCastApiAvailable=e=>{delete window.__onGCastApiAvailable,e&&!this.isDestroyed&&this.initializeCastApi()},r||S(`https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1`).catch(()=>this.errorEvent$.next({id:`ChromecastLoading`,category:x.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(){u(this.connection$.getValue())?this.disconnect():this.connect()}setVolume(e){let t=this.connection$.getValue();b(t)||(t.remotePlayer.volumeLevel=e,t.remotePlayerController.setVolumeLevel())}setMuted(e){let t=this.connection$.getValue();b(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),n=cast.framework.CastContext.getInstance();this.subscription.add(g(n,cast.framework.CastContextEventType.SESSION_STATE_CHANGED).subscribe(e=>{switch(e.sessionState){case cast.framework.SessionState.SESSION_STARTED:case cast.framework.SessionState.SESSION_STARTING:case cast.framework.SessionState.SESSION_RESUMED:this.contentId=n.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 c(e.sessionState)}})).add(m(g(n,cast.framework.CastContextEventType.CAST_STATE_CHANGED).pipe(v(e=>{this.log({message:`[cast.framework.RemotePlayerEventType.CAST_STATE_CHANGED]: ${JSON.stringify(e)}`})}),_(e=>e.castState)),h([n.getCastState()])).pipe(y(),_(ee),v(e=>{this.log({message:`realCastState$: ${e}`})})).subscribe(this.realCastState$)).add(this.realCastState$.subscribe(r=>{let i=r===`CONNECTED`,a=u(this.connection$.getValue());if(i&&!a){let r=n.getCurrentSession();l(r);let i=r.getCastDevice(),a=r.getMediaSession()?.media?.contentId;(b(a)||a===this.contentId)&&(this.log({message:`connection created`}),this.connection$.next({remotePlayer:e,remotePlayerController:t,session:r,castDevice:i}))}else!i&&a&&(this.log({message:`connection destroyed`}),this.connection$.next(void 0));this.castState$.next(r===`CONNECTED`?u(this.connection$.getValue())?`CONNECTED`:`AVAILABLE`:r)}))}initializeCastApi(){let e,t,n;try{e=cast.framework.CastContext.getInstance(),t=chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,n=chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED}catch{return}try{e.setOptions({receiverApplicationId:this.params.receiverApplicationId??t,autoJoinPolicy:n}),this.initListeners()}catch(e){this.errorEvent$.next({id:`ChromecastInitializer`,category:x.EXTERNAL_API,message:`[initializeCastApi] failed`,thrown:e})}}}var ee=e=>{switch(e){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 c(e)}};import{assertNonNullable as w,combine as T,debounce as E,ErrorCategory as D,filter as O,filterChanged as te,isNonNullable as ne,isNullable as re,map as ie,Subscription as ae,ValueSubject as oe}from"@vkontakte/videoplayer-shared";import{assertNever as se,assertNonNullable as ce,ErrorCategory as le,getHighestQuality as ue,isNonNullable as de}from"@vkontakte/videoplayer-shared";import{assertNever as fe}from"@vkontakte/videoplayer-shared";var pe=`_offset_p`,me=e=>{if(e.includes(pe))return!0;try{return new URL(e).searchParams.has(`offset_p`)}catch{return!1}},k=(e,t=0,n=0)=>{switch(n){case 0:return e.replace(pe,t===0?``:`_`+t.toFixed(0));case 1:{if(t===0)return e;let n=new URL(e);return n.searchParams.append(`playback_shift`,t.toFixed(0)),n.toString()}case 2:{let n=new URL(e);return!n.searchParams.get(`offset_p`)&&t===0?e:(n.searchParams.set(`offset_p`,t.toFixed(0)),n.toString())}default:fe(n)}return e},he=(e,t)=>{switch(t){case 0:return NaN;case 1:{let t=new URL(e);return Number(t.searchParams.get(`playback_shift`))}case 2:{let t=new URL(e);return Number(t.searchParams.get(`offset_p`)??0)}default:fe(t)}},ge=e=>{let{source:t,format:n,meta:r,output:i}=e,a,o,s;switch(n){case`MPEG`:{let e=t[n];ce(e);let r=ue(Object.keys(e));ce(r);let i=e[r];ce(i),a=i,o=`video/mp4`,s=_e();break}case`HLS`:case`HLS_FMP4`:case`HLS_ONDEMAND`:{let e=t[n];ce(e),a=e.url,o=`application/x-mpegurl`,s=_e();break}case`DASH_SEP`:case`DASH_ONDEMAND`:case`DASH_WEBM`:case`DASH_WEBM_AV1`:case`DASH_STREAMS`:{let e=t[n];ce(e),a=e.url,o=`application/dash+xml`,s=_e();break}case`DASH_LIVE_CMAF`:{let e=t[n];ce(e),a=e.url,o=`application/dash+xml`,s=ve();break}case`HLS_LIVE`:case`HLS_LIVE_CMAF`:{let e=t[n];ce(e),a=k(e.url),o=`application/x-mpegurl`,s=ve();break}case`DASH_LIVE`:case`WEB_RTC_LIVE`:{let e=`Unsupported format for Chromecast`,t=Error(e);throw i.error$.next({id:`ChromecastProvider.createMediaInfo()`,category:le.VIDEO_PIPELINE,message:e,thrown:t}),t}case`DASH`:case`DASH_LIVE_WEBM`:throw Error(`${n} is no longer supported`);default:return se(n)}let c=ye(r.videoId??a,o);c.contentUrl=a,c.streamType=s,c.metadata=be();let{title:l,subtitle:u}=r;return de(l)&&(c.metadata.title=l),de(u)&&(c.metadata.subtitle=u),c};function _e(){return chrome.cast?.media?.StreamType?.BUFFERED??`BUFFERED`}function ve(){return chrome.cast?.media?.StreamType?.LIVE??`LIVE`}function ye(e,t){return chrome.cast?.media?.MediaInfo?new chrome.cast.media.MediaInfo(e,t):{contentId:e,contentType:t,metadata:{title:``,subtitle:``},streamType:_e()}}function be(){return chrome.cast?.media?.GenericMediaMetadata?new chrome.cast.media.GenericMediaMetadata:{images:[],metadataType:0,releaseDate:``,subtitle:``,title:``,releaseYear:1970,type:0}}var A=(e,t,n=!1)=>{let r=e.getTransition();(n||!r||r.to===t)&&e.setState(t)};import{createTimers as xe,TimerModule as Se}from"@vkontakte/videoplayer-shared";var j=xe(Se.CORE);class Ce{params;interval=0;startVideoPosition;startTs;constructor(e){this.params=e}start(e=0){j.clearInterval(this.interval),this.startVideoPosition=e,this.startTs=Date.now(),this.interval=j.setInterval(()=>{let e=(Date.now()-this.startTs)/1e3,t=this.startVideoPosition+e;this.params.output.position$.next(t)},1e3)}pause(){j.clearInterval(this.interval)}destroy(){j.clearInterval(this.interval)}}import{assertNever as we}from"@vkontakte/videoplayer-shared";import{isBrowserWindow as Te,ValueSubject as Ee}from"@vkontakte/videoplayer-shared";import{getWindow as De,isNullable as Oe}from"@vkontakte/videoplayer-shared";class ke{_current;_current_version;_chromeVersion;_firefoxVersion;_safariVersion;_operaVersion;_edgeVersion;_yandexVersion;_isMiuiBrowser=!1;get current(){return this._current}get isChrome(){return this.current===`Chrome`}get isChromiumBased(){return[`Chrome`,`Chromium`,`Opera`,`Yandex`,`Edge`,`SamsungBrowser`].includes(this.current)}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,n=/samsungbrowser/i.test(e)?`SamsungBrowser`:void 0,r=/chrome|crios/i.test(e)?`Chrome`:void 0,i=/chromium/i.test(e)?`Chromium`:void 0,a=/firefox|fxios/i.test(e)?`Firefox`:void 0,o=/smart-tv;.*tizen/i.test(e)?`Chrome`:void 0,s=/webkit|safari|khtml/i.test(e)?`Safari`:void 0,c=/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||n||a||c||l||r||i||o||s||`Rest`}catch(e){console.error(e)}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}=De().navigator,n=t.match(e);if(!n)return;let r=n[1],i=parseInt(r,10);if(!isNaN(i))return this._current_version=i,i}catch(e){console.error(e)}}detectChromeVersion(){this._chromeVersion=this.detectVersion(/Chrome\/(\d+\.\d+)/),Oe(this._chromeVersion)&&(this._chromeVersion=this.detectVersion(/(\d+\.\d+\.\d+\.\d+)\/\d+\.\d+ TV/))}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+)/)}}import{getWindow as Ae,isBrowserWindow as je}from"@vkontakte/videoplayer-shared";var Me=()=>/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(navigator.appVersion??navigator.userAgent)||navigator?.userAgentData?.mobile;class Ne{_displayChecker;_isMobile;_isSmartTV=!1;_current;_iosVersion;_highEntropyValues={};_os={name:`Unknown`,version:`Unknown`,full:`Unknown`};_details={vendor:`Unknown`,model:`Unknown`};_hardware={};_gpuDetection;constructor(e){this._displayChecker=e}get current(){return this._current}get os(){return this._os}get details(){return this._details}get isSmartTV(){return this._isSmartTV}get hardware(){return this._hardware}get highEntropyValues(){return this._highEntropyValues}get isIOS(){return this._highEntropyValues.platform===`iOS`||this.os.name.toLowerCase().includes(`ios`)||[`iPhone`,`iPad`,`iPod`].includes(this.current)}get isIPadOS(){let e=this.current===`Mac`&&this._displayChecker.isTouch;return this.current===`iPad`||e}get isMac(){return this._highEntropyValues.platform===`macOS`||this.os.name.toLowerCase().includes(`mac`)||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.os.name.toLowerCase().includes(`android`)||this.current===`Android`}get isWindows(){return this.os.name.toLowerCase().includes(`windows`)}get isLinux(){return this.os.name.toLowerCase().includes(`linux`)&&!this.isAndroid}get isMobile(){return this._highEntropyValues.mobile||this._isMobile}get isTablet(){if(this.isIPadOS||this._highEntropyValues.formFactors?.includes(`Tablet`))return!0;if(!this.isAndroid)return!1;let e=Ae();if(!je(e))return!1;let t=e.navigator;return t?t.userAgentData?.mobile===!1?!0:this._displayChecker.isTouch&&!/\bMobile\b/i.test(t.userAgent):!1}get iOSVersion(){return this._iosVersion}detect(){let e=Ae();if(!je(e))return;let{userAgent:t}=e.navigator;try{this._isMobile=Me()}catch(e){console.error(`DeviceChecker: calling isMobile error - `,e)}this.detectDevice(t),this.detectOS(t),this.detectDeviceDetails(t),this.detectHardware(e),this.detectHighEntropyValues(),this.isIOS&&this.detectIOSVersion(),this.detectSmartTv()}detectHardware(e){let t=e.navigator;try{this._hardware={cpuCores:t.hardwareConcurrency,memoryGb:t.deviceMemory}}catch(e){console.error(`DeviceChecker: detectHardware error - `,e)}}detectGpu(){return this._gpuDetection??=this.requestGpuInfo(),this._gpuDetection}async requestGpuInfo(){let e=Ae();if(je(e))try{let t=await e.navigator.gpu?.requestAdapter();this._hardware={...this._hardware,gpuVendor:t?.info?.vendor||void 0,gpuArchitecture:t?.info?.architecture||void 0}}catch(e){console.error(`DeviceChecker: detectGpu error - `,e)}}async detectHighEntropyValues(){let e=Ae();if(!je(e))return;let{userAgentData:t}=e.navigator;if(t?.getHighEntropyValues){let e=await t.getHighEntropyValues([`architecture`,`bitness`,`brands`,`mobile`,`platform`,`formFactors`,`model`,`platformVersion`,`wow64`]);this._highEntropyValues=e,e.platform&&(this._os.name=this.normalizeOSName(e.platform),e.platformVersion&&(this._os.version=this.normalizeOSVersion(e.platformVersion),this._os.full=`${this._os.name} ${this._os.version}`)),e.model&&(this._details.model=e.model)}}detectSmartTv(){try{this._isSmartTV=!1;let e=Ae();if(!je(e))return;let{userAgent:t}=e.navigator;this._isSmartTV=/smart[\w\-_ ]*tv/i.test(t)||/samsung/i.test(t)&&/tizen/i.test(t)}catch(e){console.error(`DeviceChecker: Smart TV detection error - `,e)}}detectDevice(e){try{let t=/android/i.test(e)?`Android`:void 0,n=/iphone/i.test(e)?`iPhone`:void 0,r=/ipad/i.test(e)?`iPad`:void 0,i=/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||n||r||i||o||a||`Desktop`}catch(e){console.error(`DeviceChecker: device detection error - `,e)}}detectOS(e){try{for(let[t,n]of[[/(windows nt) (6\.[23]); arm/i,[`Windows RT`]],[/(windows nt) (6\.3); arm/i,[`Windows RT 8.1`]],[/(windows (?:phone|mobile|iot))(?: os)?[/ ]?([\d.]+)/i,[`Windows Mobile`,2]],[/(windows)[/ ](xp|vista|7|8(\.1)?|10|11|2000|me)/i,[1,1]],[/windows nt ?([\d.]+)/i,[`Windows`,1]],[/(windows)[/ ](95|98|me|2000|xp|vista|7|8|8\.1|10|11)/i,[1,2]],[/(iphone os|cpu iphone os) ([\d_.]+)/i,[`iOS`,2]],[/(ipad os|cpu os) ([\d_.]+)/i,[`iPadOS`,2]],[/(ipod os|cpu ipod os) ([\d_.]+)/i,[`iOS`,2]],[/(?:ios|os) ([\d_.]+) like mac os x/i,[`iOS`,1]],[/cfnetwork\/.+darwin/i,[`iOS`]],[/(mac os x) ?([\d_.]+)/i,[`macOS`,2]],[/(macintosh|mac os)/i,[`macOS`]],[/(android) ([\d.]+)/i,[1,2]],[/(harmonyos)[/ ]?([\d.]*)/i,[`HarmonyOS`,2]],[/\b(ubuntu|debian|fedora|centos|arch|linux)(?:[-/ ]([\w.]+))?/i,[1,2]],[/(cros)\D*([\d.]+)/i,[`Chrome OS`,2]],[/(freebsd|openbsd|netbsd|dragonfly)[/ ]?([\w.]*)/i,[1,2]],[/(sunos|solaris)?([\d.]*)/i,[`Solaris`,2]],[/(aix)?([\d.]*)/i,[`AIX`,2]]]){let r=e.match(t);if(r){let t=n.length>0,i=n.length>1,a=`Unknown`,o=`Unknown`;if(t){let e=n[0];typeof e==`number`?e<r.length&&r[e]!==void 0&&(a=r[e]):a=e}if(i){let e=n[1];typeof e==`number`?e<r.length&&r[e]!==void 0&&(o=r[e]):e!==void 0&&(o=e)}else r[2]===void 0?r[1]!==void 0&&t&&typeof n[0]==`string`&&(o=r[1]):o=r[2];a=this.normalizeOSName(a),o=this.normalizeOSVersion(o,a),a===`iOS`&&/ipad/i.test(e)?a=`iPadOS`:a===`iPadOS`&&/ip(hone|od)/i.test(e)&&(a=`iOS`),this._os={name:a,version:o||`Unknown`,full:o&&o!==`Unknown`?`${a} ${o}`:a};break}}}catch(e){console.error(`DeviceChecker: OS detection error - `,e)}}normalizeOSName(e){if(!e)return`Unknown`;let t=e.toLowerCase();return t.includes(`windows`)?`Windows`:t.includes(`mac os`)||t.includes(`macintosh`)?`macOS`:t.includes(`iphone`)||t.includes(`ios`)?`iOS`:t.includes(`ipados`)?`iPadOS`:t.includes(`android`)?`Android`:t.includes(`harmonyos`)?`HarmonyOS`:t.includes(`linux`)?`Linux`:t.includes(`cros`)?`Chrome OS`:t.includes(`freebsd`)?`FreeBSD`:t.includes(`openbsd`)?`OpenBSD`:t.includes(`solaris`)||t.includes(`sunos`)?`Solaris`:t.includes(`aix`)?`AIX`:e}normalizeOSVersion(e,t){if(!e)return`Unknown`;if(e!==`Unknown`&&(e=e.replace(/_/g,`.`),t===`Windows`)){let t=parseFloat(e);if(!isNaN(t)){if(t>=11)return`11`;if(t>=10)return`10`;if(t===6.3)return`8.1`;if(t===6.2)return`8`;if(t===6.1)return`7`;if(t===6)return`Vista`;if(t===5.1||t===5.2)return`XP`;if(t===5)return`2000`;if(t===4)return`NT 4.0`}}return e}detectDeviceDetails(e){try{for(let[t,n]of[[/(iphone)/i,[`Apple`,`iPhone`]],[/(ipad)/i,[`Apple`,`iPad`]],[/(ipod)/i,[`Apple`,`iPod`]],[/(macintosh)/i,[`Apple`,`Macintosh`]],[/(windows[\w\-_ ]*phone)/i,[`Microsoft`,0]],[/(windows nt|win64|win32|wow64)/i,[`Microsoft`,`PC`]],[/\b(sch-i[89]0\d|shw-m380s|sm-[ptxs]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i,[`Samsung`,1]],[/\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?\d+a?|galaxy nexus)/i,[`Samsung`,1]],[/samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,[`Samsung`,1]],[/sec-(sgh\w+)/i,[`Samsung`,1]],[/smart-tv.+(samsung)/i,[`Samsung`,`Smart TV`]],[/(samsung).*tizen/i,[`Samsung`,`Smart TV`]],[/(pixel (?:c|tablet|[0-9a-z ]+))/i,[`Google`,1]],[/(pixelbook(?: go)?)/i,[`Google`,1]],[/nexus [0-9]/i,[`Google`,0]],[/(redmi[-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i,[`Xiaomi`,1]],[/\b(mi[\w\-_ ]+)(?: bui|\))/i,[`Xiaomi`,1]],[/\b(poco[\w ]+)(?: bui|\))/i,[`Xiaomi`,1]],[/\b(hm[-_ ]?note?[\w ]*)(?: bui|\))/i,[`Xiaomi`,1]],[/\b(?:xiao)?mi[\w\-_ ]+pad/i,[`Xiaomi`,0]],[/(?:huawei|honor) ?([-\w ]+)[;)]/i,[`Huawei`,1]],[/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i,[`Huawei`,1]],[/\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?)/i,[`Huawei`,1]],[/(?:one)?(?:plus)? ?([a\d0]\d\d\d?)(?: b|\))/i,[`OnePlus`,1]],[/droid.+; (cph2[3-6]\d[13579]|((?:gm|hd)19|(?:ac|be|in|kb)20|(?:d[en]|eb|le|mt)21|ne22)[0-2]\d)(?: bui|\))/i,[`OnePlus`,1]],[/(oneplus)[-_ ]?([-\w]*)/i,[`OnePlus`,2]],[/\b(rmx[1-3]\d{3})(?: bui|;|\))/i,[`Realme`,1]],[/(realme)[-_ ]?([-\w]*)/i,[`Realme`,2]],[/; (\w+) bui.+ oppo/i,[`OPPO`,1]],[/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i,[`OPPO`,1]],[/\b(opd2(\d{3}a?))(?: bui|\))/i,[`OPPO`,1]],[/(oppo)[-_ ]?([-\w]*)/i,[`OPPO`,2]],[/; vivo (\w+)(?: bui|\))/i,[`Vivo`,1]],[/\b(v[12]\d{3}\w?[at])(?: bui|;)/i,[`Vivo`,1]],[/(vivo)[-_ ]?([-\w]*)/i,[`Vivo`,2]],[/\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,[`Motorola`,1]],[/((?:moto(?! 360)[-\w() ]+|xt\d{3,4}[cgkosw+]?[-\d]*|nexus 6)(?= bui|\)))/i,[`Motorola`,1]],[/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b/i,[`Motorola`,0]],[/\b(mz60\d|xoom[2 ]{0,2}) build\//i,[`Motorola`,0]],[/droid.+; ([a-z]?\d[0-2]{2}[a-z]{2}|[c-g]\d{4}|so[-gl]\w+|xq-[a-z]{2}\d\d)(?= bui|\))/i,[`Sony`,1]],[/sony tablet [ps]/i,[`Sony`,`Xperia Tablet`]],[/\b(?:sony)?sgp\w+(?: bui|\))/i,[`Sony`,0]],[/(sony)[-_ ]?([-\w]*)/i,[`Sony`,2]],[/\blg[-e;/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,[`LG`,1]],[/\blg-?([\d\w]+) bui/i,[`LG`,1]],[/(lm(?:-?f100[nv]?|-[\w.]+)(?= bui|\))|nexus [45])/i,[`LG`,1]],[/((?=lg)?[vl]k-?\d{3}) bui/i,[`LG`,0]],[/(lg)[-_ ]?([-\w]*)/i,[`LG`,2]],[/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,[`Nokia`,1]],[/nokia[-_ ]?(([-\w. ]*?))(?: bui|\)|;|\/)/i,[`Nokia`,1]],[/(nokia) (t[12][01])/i,[`Nokia`,2]],[/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i,[`ASUS`,1]],[/(?:asus[-_ ])?(zenfone[\w\-_ ]*)/i,[`ASUS`,1]],[/(rog[\w\-_ ]*)/i,[`ASUS`,1]],[/(asus)[-_ ]?([-\w]*)/i,[`ASUS`,2]],[/lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i,[`Lenovo`,1]],[/(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])(?: bui|;|\)|\/)/i,[`Lenovo`,1]],[/(thinkpad[\w\-_ ]*)/i,[`Lenovo`,0]],[/(kf[a-z]{2}[a-z]*)(?: bui|\))/i,[`Amazon`,1]],[/(alexa)webm/i,[`Amazon`,`Echo`]],[/(fire[\w\-_ ]*)/i,[`Amazon`,0]],[/(amazon)[-_ ]?([-\w]*)/i,[`Amazon`,2]],[/(?:blackberry|\(bb10;) (\w+)/i,[`BlackBerry`,1]],[/\b((?:bb[a-f]|st[hv])100-\d)/i,[`BlackBerry`,1]],[/(playbook);[-\w),; ]+(rim)/i,[`BlackBerry`,1]],[/(microsoft); (lumia[\w ]+)/i,[`Microsoft`,2]],[/(surface duo)/i,[`Microsoft`,`Surface Duo`]],[/(surface[\w\-_ ]*)/i,[`Microsoft`,0]],[/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,[`ZTE`,2]],[/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,[`HTC`,2]],[/(alcatel|tcl)[-_ ]?([-\w]*)/i,[1,2]],[/(meizu)[-_ ]?([-\w]*)/i,[`Meizu`,2]],[/(tecno)[-_ ]?([-\w]*)/i,[`Tecno`,2]],[/(infinix)[-_ ]?([-\w]*)/i,[`Infinix`,2]],[/(micromax)[-_ ]?([-\w]*)/i,[`Micromax`,2]],[/(lava)[-_ ]?([-\w]*)/i,[`Lava`,2]],[/(panasonic)[-_ ]?([-\w]*)/i,[`Panasonic`,2]],[/(sharp)\/?([-\w]*)/i,[`Sharp`,2]],[/(benq)[-_ ]?([-\w]*)/i,[`BenQ`,2]],[/(palm)[-_ ]?([-\w]*)/i,[`Palm`,2]],[/(vertu)[-_ ]?([-\w]*)/i,[`Vertu`,2]],[/(gionee)[-_ ]?([-\w]*)/i,[`Gionee`,2]],[/(doogee)[-_ ]?([-\w]*)/i,[`Doogee`,2]],[/(ulefone)[-_ ]?([-\w]*)/i,[`Ulefone`,2]],[/(blackview)[-_ ]?([-\w]*)/i,[`Blackview`,2]],[/(cubot)[-_ ]?([-\w]*)/i,[`Cubot`,2]],[/(umidigi)[-_ ]?([-\w]*)/i,[`UMIDIGI`,2]],[/(oukitel)[-_ ]?([-\w]*)/i,[`Oukitel`,2]],[/(fairphone)[-_ ]?([-\w]*)/i,[`Fairphone`,2]],[/(cat)[-_ ]?([-\w]*)/i,[`Cat`,2]],[/(energy)[-_ ]?([-\w]*)/i,[`Energizer`,2]],[/(land rover)[-_ ]?([-\w]*)/i,[`Land Rover`,2]],[/(shield[\w\-_ ]*)/i,[`Nvidia`,0]],[/(crkey)/i,[`Google`,`Chromecast`]],[/(roku)[\dx]*/i,[`Roku`,0]],[/(apple)[-_ ]?tv/i,[`Apple`,`TV`]],[/(amazon)[-_ ]?tv/i,[`Amazon`,`Fire TV`]],[/(google)[-_ ]?tv/i,[`Google`,`TV`]],[/(smart[\w\-_ ]*tv)/i,[0,`Smart TV`]],[/(playstation[\w\-_ ]*)/i,[`Sony`,0]],[/(nintendo[\w\-_ ]*)/i,[`Nintendo`,0]],[/(xbox[\w\-_ ]*)/i,[`Microsoft`,0]],[/(googlebot)/i,[`Google`,`Bot`]],[/(bingbot)/i,[`Microsoft`,`Bing Bot`]],[/(yandexbot)/i,[`Yandex`,`Bot`]],[/(slackbot)/i,[`Slack`,`Bot`]],[/(twitterbot)/i,[`Twitter`,`Bot`]],[/(facebookbot)/i,[`Facebook`,`Bot`]],[/(linkedinbot)/i,[`LinkedIn`,`Bot`]],[/(tesla)[-_ ]?([-\w]*)/i,[`Tesla`,2]],[/(raspberry[\w\-_ ]*)/i,[`Raspberry Pi`,0]]]){let r=e.match(t);if(r){let e=n[0],t=n[1],i=typeof e==`number`?r[e]===void 0?`Unknown`:this.normalizeVendorName(r[e]):this.normalizeVendorName(e),a=`Unknown`;typeof t==`number`?a=r[t]===void 0?`Unknown`:r[t]:t===void 0?r[1]===void 0?r[0]!==void 0&&(a=r[0]):a=r[1]:a=t,a=this.normalizeModelName(a,i),this.details.vendor=i,this.details.model=a;break}}}catch(e){console.error(`DeviceChecker: device details detection error - `,e)}}normalizeVendorName(e){return e?{apple:`Apple`,samsung:`Samsung`,google:`Google`,xiaomi:`Xiaomi`,huawei:`Huawei`,oneplus:`OnePlus`,oppo:`OPPO`,vivo:`Vivo`,realme:`Realme`,motorola:`Motorola`,sony:`Sony`,lg:`LG`,nokia:`Nokia`,asus:`ASUS`,lenovo:`Lenovo`,amazon:`Amazon`,blackberry:`BlackBerry`,microsoft:`Microsoft`,zte:`ZTE`,htc:`HTC`,alcatel:`Alcatel`,tcl:`TCL`,meizu:`Meizu`,tecno:`Tecno`,infinix:`Infinix`,micromax:`Micromax`,lava:`Lava`,panasonic:`Panasonic`,sharp:`Sharp`,benq:`BenQ`,palm:`Palm`,honor:`Honor`,nvidia:`NVIDIA`,roku:`Roku`}[e.toLowerCase()]||e.charAt(0).toUpperCase()+e.slice(1).toLowerCase():`Unknown`}normalizeModelName(e,t){if(!e||e===`Unknown`)return e;if(e===`0`)return`Unknown`;let n=e.replace(/^build\//i,``).replace(/\s+bui$/i,``).replace(/\)$/,``).replace(/[;,)]/g,``).replace(/\s*\(.*?\)\s*/g,``).trim(),r=t.toLowerCase();return r.includes(`samsung`)?n=n.replace(/^(sm-|gt-|sgh-|sch-)/i,``):r.includes(`xiaomi`)?n=n.replace(/^(mi[\s\-_]*|redmi[\s\-_]*)/i,``):r.includes(`oneplus`)?n=n.replace(/^oneplus[\s\-_]*/i,``):r.includes(`google`)&&(n=n.replace(/^(pixel[\s\-_]*|nexus[\s\-_]*)/i,``)),n=n.replace(/_/g,` `).replace(/-/g,` `).replace(/\s+/g,` `).trim(),n?(n.length>0&&/^[a-z]/.test(n)&&(n=n.charAt(0).toUpperCase()+n.slice(1)),n):`Unknown`}detectIOSVersion(){try{let e=Ae();if(!je(e))return;if(this._highEntropyValues.platformVersion){let e=this._highEntropyValues.platformVersion.split(`.`).slice(0,2).join(`.`);this._iosVersion=parseFloat(e);return}if(this._os.version!==`Unknown`){let e=this._os.version.split(`.`),t=e.length>=2?`${e[0]}.${e[1]}`:e[0];this._iosVersion=parseFloat(t);return}let t=e.navigator.userAgent.match(/OS (\d+(_\d+)?)/i);t?.[1]&&(this._iosVersion=parseFloat(t[1].replace(/_/g,`.`)))}catch(e){console.error(`DeviceChecker: iOS version detection error - `,e)}}}import{getWindow as Pe,isBrowserWindow as Fe}from"@vkontakte/videoplayer-shared";var Ie=[`rec2020`,`p3`,`srgb`],Le=[`standalone`,`minimal-ui`,`fullscreen`,`window-controls-overlay`,`picture-in-picture`];class Re{_maxTouchPoints;_height;_width;_isHdr;_pixelRatio;_screenHeight;_screenWidth;_colorDepth;_colorGamut;_displayMode=`browser`;_isStandalone=!1;get isTouch(){return typeof this._maxTouchPoints==`number`?this._maxTouchPoints>1:`ontouchstart`in Pe()}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}get colorGamut(){return this._colorGamut}get displayMode(){return this._displayMode}get isStandalone(){return this._isStandalone}detect(){let e=Pe();if(!Fe(e))return;let{navigator:t,screen:n}=e,{maxTouchPoints:r}=t;try{this._maxTouchPoints=r??0,this._isHdr=!!e.matchMedia(`(dynamic-range: high)`)?.matches,this._colorDepth=n.colorDepth,this._colorGamut=this.detectColorGamut(e)}catch(e){console.error(e)}try{this._pixelRatio=e.devicePixelRatio||1,this._height=n.height,this._width=n.width,this._height=n.height,this._screenHeight=this._height*this._pixelRatio,this._screenWidth=this._width*this._pixelRatio}catch(e){console.error(e)}try{this._displayMode=this.detectDisplayMode(e);let n=t.standalone===!0;this._isStandalone=n||this._displayMode!==`browser`}catch(e){console.error(e)}}detectColorGamut(e){return Ie.find(t=>e.matchMedia?.(`(color-gamut: ${t})`)?.matches)}detectDisplayMode(e){return Le.find(t=>e.matchMedia?.(`(display-mode: ${t})`)?.matches)??`browser`}}import{getWindow as ze,isBrowserWindow as Be}from"@vkontakte/videoplayer-shared";var Ve=()=>window.ManagedMediaSource||window.MediaSource,He=()=>!!(window.ManagedMediaSource&&window.ManagedSourceBuffer?.prototype?.appendBuffer),Ue=()=>!!(window.MediaSource&&window.SourceBuffer?.prototype?.appendBuffer),We=()=>window.ManagedMediaSource?new ManagedMediaSource:new MediaSource,Ge=ze().document?.createElement(`video`),Ke=`video/mp4; codecs="avc1.42000a,mp4a.40.2"`,qe=`video/mp4; codecs="hev1.1.6.L93.B0"`,Je=`video/webm; codecs="vp09.00.10.08"`,Ye=`video/webm; codecs="av01.0.00M.08"`,Xe=`audio/mp4; codecs="mp4a.40.2"`,Ze=`audio/webm; codecs="opus"`,Qe;(async()=>{let e=ze();if(!Be(e)||!(`mediaCapabilities`in e.navigator))return;let t={type:`media-source`,video:{contentType:`video/webm`,width:1280,height:720,bitrate:1e6,framerate:30}},[n,r]=await Promise.all([e.navigator.mediaCapabilities.decodingInfo({...t,video:{...t.video,contentType:Ye}}),e.navigator.mediaCapabilities.decodingInfo({...t,video:{...t.video,contentType:Je}})]);Qe={DASH_WEBM_AV1:n,DASH_WEBM:r}})().catch(e=>{console.log(Ge),console.error(e)});class $e{_video;_deviceChecker;_browserChecker;_protocols;_containers;_codecs;_nativeHlsSupported;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 Qe}get supportedCodecs(){return Object.keys(this._codecs).filter(e=>this._codecs[e])}get nativeHlsSupported(){return this._nativeHlsSupported}detect(){let e=ze();if(!Be(e))return;let t=e.document;this._video=t.createElement(`video`);try{this._protocols={mms:He(),mse:Ue(),hls:!!(this._video.canPlayType?.(`application/x-mpegurl`)||this._video.canPlayType?.(`vnd.apple.mpegURL`)),webrtc:!!e.RTCPeerConnection,ws:!!e.WebSocket},this._containers={mp4:!!this._video.canPlayType?.(`video/mp4`),webm:!!this._video.canPlayType?.(`video/webm`),cmaf:!0};let t=!!Ve()?.isTypeSupported?.(Ke),n=!!Ve()?.isTypeSupported?.(qe),r=!!Ve()?.isTypeSupported?.(Xe);this._codecs={h264:t,h265:n,vp9:!!Ve()?.isTypeSupported?.(Je),av1:!!Ve()?.isTypeSupported?.(Ye),aac:r,opus:!!Ve()?.isTypeSupported?.(Ze),mpeg:(t||n)&&r},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}}import{getWindow as et,isBrowserWindow as tt}from"@vkontakte/videoplayer-shared";var nt=`audio/mpeg`;class rt{_audio;_containers;_codecs;supportMp3(){return this._codecs.mp3&&this._containers.mpeg}detect(){let e=et();if(!tt(e))return;let t=e.document;this._audio=t.createElement(`audio`);try{this._containers={mpeg:!!this._audio.canPlayType?.(nt)},this._codecs={mp3:!!Ve()?.isTypeSupported?.(nt)}}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}}class it{isInited$=new Ee(!1);_displayChecker;_deviceChecker;_browserChecker;_videoChecker;_audioChecker;constructor(){this._displayChecker=new Re,this._deviceChecker=new Ne(this._displayChecker),this._browserChecker=new ke,this._videoChecker=new $e(this._deviceChecker,this._browserChecker),this._audioChecker=new rt,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(){Te()&&(this._displayChecker.detect(),this._deviceChecker.detect(),this._browserChecker.detect(),this._videoChecker.detect(),this._audioChecker.detect(),this.isInited$.next(!0))}}var M=new it,at=(e,t=!1)=>{let{containers:n,protocols:r,codecs:i,nativeHlsSupported:a}=M.video,{isMobile:o}=M.device,s=M.device.isMac&&M.browser.isSafari,c=t&&!o&&!s,l=(i.h264||i.h265)&&i.aac,u=r.mse||r.mms;return e.filter(e=>{switch(e){case`DASH_SEP`:return u&&n.mp4&&l;case`DASH_WEBM`:return u&&n.webm&&i.vp9&&i.opus;case`DASH_WEBM_AV1`:return u&&n.webm&&i.av1&&i.opus;case`DASH_STREAMS`:return u&&(n.mp4&&l||n.webm&&(i.vp9||i.av1)&&(i.opus||i.aac));case`DASH_LIVE`:return u&&n.mp4&&l;case`DASH_LIVE_CMAF`:return u&&n.mp4&&l&&n.cmaf;case`DASH_ONDEMAND`:return u&&n.mp4&&l;case`HLS`:case`HLS_ONDEMAND`:case`HLS_FMP4`:case`HLS_LIVE`:case`HLS_LIVE_CMAF`:return a&&!c;case`MPEG`:return n.mp4;case`DASH`:case`DASH_LIVE_WEBM`:return!1;case`WEB_RTC_LIVE`:return r.webrtc&&r.ws&&i.h264&&(n.mp4||n.webm);default:return we(e)}})},ot=e=>{switch(e){case`MPEG`:case`DASH`:case`DASH_SEP`:case`DASH_ONDEMAND`:case`DASH_WEBM`:case`DASH_WEBM_AV1`:case`DASH_STREAMS`:case`HLS`:case`HLS_FMP4`: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 we(e)}},st=(e,t=!1)=>at(Object.keys(e).filter(e=>!ot(e)),t).length>0;class ct{subscription=new ae;log;params;sessionId$=new oe(null);mediaSessionId$=new oe(null);contentId$=new oe(null);progressTicker;isMobile=Me();mobileVolumeState={muted:!1,volume:0};media=null;lastRequestedVolume=null;constructor(e){this.params=e,this.progressTicker=new Ce(e),this.log=this.params.dependencies.logger.createComponentLog(`ChromecastPresentationApiProvider`),this.log({message:`constructor, format: ${e.format}`}),this.params.output.isLive$.next(ot(e.format)),this.subscribe()}subscribe(){let e=e=>{this.params.output.error$.next({category:D.WTF,id:`ChromecastPresentationApiProvider`,message:e?.message??`Unknown error`,thrown:e})};this.subscription.add(this.params.chromecastConnector.message$.pipe(O(e=>!!e)).subscribe(e=>{this.handleMessage(e)},e)),this.subscription.add(this.sessionId$.pipe(O(ne),te(),E(0)).subscribe(()=>{this.loadMedia()},e));let t=this.contentId$.pipe(te(),ie(Boolean));this.subscription.add(T({seekState:this.params.desiredState.seekState.stateChangeEnded$,mediaLoaded:t}).pipe(O(({mediaLoaded:e})=>e)).subscribe(()=>{let e=this.params.desiredState.seekState.getState();e.state===`requested`&&this.seek(e.position/1e3)},e));let n=T({playbackState:this.params.desiredState.playbackState.stateChangeStarted$,mediaLoaded:t});this.subscription.add(n.pipe(O(({mediaLoaded:e})=>e),E(0)).subscribe(()=>{this.syncPlayback()},e)),this.subscription.add(n.pipe(O(({mediaLoaded:e,playbackState:{from:t,to:n}})=>!e&&t===`stopped`&&n===`playing`)).subscribe(()=>{this.loadMedia()},e)),this.subscription.add(T({volumeState:this.params.desiredState.volume.stateChangeStarted$.pipe(E(30)),mediaLoaded:t}).pipe(O(({mediaLoaded:e})=>e)).subscribe(({volumeState:e})=>{let{muted:t,volume:n}=e.to;this.setVolume(n,t)},e))}handleMessage(e){switch(e.type){case`new_session`:case`update_session`:{this.sessionId$.next(e.message.sessionId);let t=e.message?.media?.[0];this.syncMediaState(t);let n=e.message?.receiver.volume;this.syncVolumeState(n)}break;case`v2_message`:switch(e.message?.type){case`MEDIA_STATUS`:{let t=e.message?.status?.[0];this.syncMediaState(t);break}}break}}loadMedia(){let e=ge(this.params),t=this.media?.currentTime,n=this.params.desiredState.seekState.getState(),r=t??(n.state===`none`?0:n.position/1e3),i=this.params.desiredState.playbackState.getState()===`playing`;this.params.chromecastConnector.sendV2Message({type:`LOAD`,requestId:0,media:e,autoplay:i,currentTime:r,customData:null,activeTrackIds:null}),this.params.output.willSeekEvent$.next()}stop(){this.params.chromecastConnector.stopMedia()}play(){let e=this.mediaSessionId$.getValue();w(e,`play on null mediaSessionId`),this.params.chromecastConnector.sendV2Message({type:`PLAY`,mediaSessionId:e,customData:null})}pause(){let e=this.mediaSessionId$.getValue();w(e,`pause on null mediaSessionId`),this.params.chromecastConnector.sendV2Message({type:`PAUSE`,mediaSessionId:e,customData:null})}seek(e){let t=this.mediaSessionId$.getValue();w(t,`seek on null mediaSessionId`),this.params.chromecastConnector.sendV2Message({type:`SEEK`,currentTime:e,mediaSessionId:t}),this.params.output.willSeekEvent$.next()}setVolume(e,t){let n=e,r=`[setVolume] volume: ${e}, muted: ${t}`;this.isMobile&&(n=this.mobileVolumeState.volume,r+=`, mobile next volume: ${n}`),this.log({message:r}),this.lastRequestedVolume={volume:n,muted:t},this.params.chromecastConnector.sendV2Message({type:`SET_VOLUME`,requestId:0,volume:{level:t?0:n,muted:t?!0:null}})}syncPlaybackState({playerState:e,idleReason:t}){let n=this.params.output.isBuffering$.getValue(),r=e===`BUFFERING`;switch(n!==r&&this.params.output.isBuffering$.next(r),e){case`PAUSED`:A(this.params.desiredState.playbackState,`paused`);break;case`PLAYING`:A(this.params.desiredState.playbackState,`playing`);break;case`IDLE`:t===`FINISHED`?(this.params.output.endedEvent$.next(),A(this.params.desiredState.playbackState,`stopped`),this.contentId$.next(null)):A(this.params.desiredState.playbackState,`ready`);break;case`BUFFERING`:break}}syncPlayback(){let e=this.params.desiredState.playbackState.getState();switch(this.log({message:`[syncPlayback] ${e}`}),e){case`ready`:break;case`playing`:this.play();break;case`paused`:this.pause();break;case`stopped`:this.stop();break}}syncMediaState=e=>{if(re(e))return;this.media=e,this.mediaSessionId$.next(e.mediaSessionId??null);let t=e.media?.contentId;t&&this.contentId$.next(t),this.syncPlaybackState(e);let n=e.media?.duration;ne(n)&&this.params.output.duration$.next(Math.max(0,n));let r=e.currentTime;if(ne(r)){this.params.desiredState.seekState.getState().state===`applying`&&this.params.output.seekedEvent$.next(),this.params.output.position$.next(r);let t=this.params.output.isLive$.getValue();e.playerState===`PLAYING`&&!t?this.progressTicker.start(r):this.progressTicker.pause()}};syncVolumeState(e){if(re(e))return;let{level:t,muted:n}=e,r={muted:n??!1,volume:t??0};this.lastRequestedVolume&&=(n&&(r.volume=this.lastRequestedVolume.volume),this.lastRequestedVolume.muted&&!t&&!n&&(r.volume=this.lastRequestedVolume.volume,r.muted=!0),null);let i=`[syncVolumeState] volume: ${r.volume}, muted: ${r.muted}`;this.isMobile&&(this.mobileVolumeState.volume=r.volume,this.mobileVolumeState.muted=r.muted,r.volume=this.params.output.volume$.getValue().volume,i+=`, volume passed to state machine: ${r.volume}`),this.log({message:i}),this.params.output.volume$.next(r)}destroy(){this.progressTicker.destroy(),this.subscription.unsubscribe()}}import{assertNonNullable as lt,ErrorCategory as ut,filter as dt,Subject as ft,Subscription as pt,tap as mt,ValueSubject as ht,fromEvent as gt,getWindow as _t}from"@vkontakte/videoplayer-shared";var vt=e=>({castDevice:{friendlyName:e},remotePlayer:{},remotePlayerController:{},session:{}}),yt=()=>String(Date.now())+String(Math.floor(Math.random()*1e5));class bt{params;clientId;capabilities=[`WEB`];presentationRequest$=new ht(null);log;sessionId$=new ht(null);broadcastChannel=new BroadcastChannel(`vk_player_chromecast_events`);subscription=new pt;subscriptionEvents=new pt;isDestroyed=!1;sequenceNumber=0;presentationAvailable$=new ht(!1);presentationConnection$=new ht(null);message$=new ht(null);friendlyName$=new ht(null);errorEvent$=new ft;constructor(e){this.clientId=this.getClientId(),this.params=e,this.log=e.logger.createComponentLog(`ChromecastPresentationApiConnector`),this.log({message:`constructor`}),this.safeReinitPresentation(),this.subscribe()}destroy(){this.log({message:`destroy`}),this.subscription.unsubscribe(),this.subscriptionEvents.unsubscribe(),this.broadcastChannel.close(),this.isDestroyed=!0}disconnect(e=!0){this.log({message:`disconnect`}),e&&this.stopMedia(),this.presentationRequest$.next(null);let t=this.presentationConnection$.getValue();t&&t.close(),this.presentationConnection$.next(null),this.friendlyName$.next(null),this.resetSequenceNumber(),this.resetSubscriptionEvents()}stopMedia(){this.log({message:`stopMedia`}),this.sendV2Message({type:`STOP`})}reinitPresentation(e=!0){let t=this.createCastUrl(),n=new PresentationRequest(t);this.presentationRequest$.next(n),this.log({message:`PresentationRequest created`}),n.getAvailability().then(e=>{let t=()=>{this.log({message:`PresentationRequest presentation availability: ${e.value}`}),this.presentationAvailable$.next(e.value)};this.subscriptionEvents.add(gt(e,`change`).subscribe(()=>{t()})),t()}).catch(()=>{this.presentationAvailable$.next(!0)}),_t().navigator.presentation.defaultRequest=n,e&&n.reconnect(`auto-join`).then(e=>{this.log({message:`PresentationRequest reconnect success`}),this.handleConnection(e)}).catch(()=>{this.log({message:`PresentationRequest reconnect failed`})})}safeReinitPresentation(e){try{this.reinitPresentation(e)}catch(e){this.errorEvent$.next({category:ut.WTF,id:`ChromecastPresentationApiConnector`,message:e?.message??`reinitPresentation error`,thrown:e})}}async connect(){this.log({message:`connect`});try{this.presentationRequest$.getValue()||(this.log({message:`reinitPresentation`}),this.reinitPresentation(!1));let e=this.presentationRequest$.getValue();lt(e,`connect with null presentationRequest`);let t=await e.start();this.handleConnection(t)}catch(e){switch(e?.name){case`AbortError`:case`NotAllowedError`:break;default:this.errorEvent$.next({category:ut.WTF,id:`ChromecastPresentationApiConnector`,message:e?.message??`connect error`,thrown:e});break}}}subscribe(){this.subscription.add(gt(this.broadcastChannel,`message`).subscribe(e=>{this.log({message:`broadcast connection data: ${e.data}`}),e.data===`connection`&&this.disconnect(!1)})),this.subscription.add(this.presentationAvailable$.subscribe(e=>{this.log({message:`presentationAvailable$: ${e}`})})),this.subscription.add(this.presentationConnection$.pipe(mt(e=>{this.log({message:`presentationConnection$: ${!!e}`})}),dt(e=>!!e)).subscribe(e=>{let t=gt(e,`message`).subscribe(e=>{let t=JSON.parse(e.data);t.clientId===this.clientId&&(this.log({message:`[onmessage] ${e.data}`}),this.handleMessage(t),this.message$.next(t))}),n=gt(e,`connect`).subscribe(()=>{this.send(`client_connect`)}),r=gt(e,`close`).subscribe(e=>{switch(e.reason){case`error`:this.errorEvent$.next({category:ut.WTF,id:`ChromecastPresentationApiConnector`,message:`Session error`,thrown:e});break;case`closed`:break}});this.subscriptionEvents.add(t),this.subscriptionEvents.add(n),this.subscriptionEvents.add(r)}))}send(e){switch(e){case`client_connect`:{let e={type:`client_connect`,message:this.clientId,sequenceNumber:-1,timeoutMillis:0,clientId:this.clientId};this.safeSend(JSON.stringify(e));break}}}sendV2Message(e){let t=this.sessionId$.getValue();if(t){let n={type:`v2_message`,sequenceNumber:this.getSequenceNumber(),timeoutMillis:0,clientId:this.clientId,message:{...e,sessionId:t}};this.safeSend(JSON.stringify(n))}}safeSend(e){try{this.log({message:`[send] ${e}`});let t=this.presentationConnection$.getValue();t?.state===`connected`&&t?.send(e)}catch(t){this.errorEvent$.next({category:ut.WTF,id:`ChromecastPresentationApiConnector`,message:`PresentationConnection send error`,data:{message:e},thrown:t})}}handleMessage(e){switch(e.type){case`new_session`:case`update_session`:this.sessionId$.next(e.message.sessionId),this.friendlyName$.next(e.message.receiver.friendlyName||`Chromecast Device`);break;case`receiver_action`:e.message?.action===`stop`&&this.disconnect();break}}createCastUrl(){return`cast:${this.params.appId}?clientId=${this.clientId}&autoJoinPolicy=tab_and_origin_scoped&defaultActionPolicy=create_session&launchTimeout=60000&supportedAppTypes=${this.capabilities}&appParams=%7B%22launchCheckerParams%22%3A%7B%7D%7D`}getSequenceNumber(){let e=this.sequenceNumber;return this.sequenceNumber=(this.sequenceNumber+1)%(2**53-1),e}resetSequenceNumber(){this.sequenceNumber=0}getClientId(){let e=`__vk_player_chromecast_id`;return _t()[e]=_t()[e]||yt()}resetSubscriptionEvents(){this.subscriptionEvents.unsubscribe(),this.subscriptionEvents=new pt}handleConnection(e){this.log({message:`connection available`}),this.isDestroyed?(this.log({message:`connected on already destroyed component`}),e.close()):(this.broadcastChannel.postMessage(`connection`),this.presentationConnection$.next(e))}}import{ValueSubject as xt,Subject as St,map as Ct,Subscription as wt,combine as Tt,filterChanged as Et,assertNonNullable as Dt}from"@vkontakte/videoplayer-shared";class Ot{subscription=new wt;log;contentId;connection$=new xt(void 0);castState$=new xt(`NOT_AVAILABLE`);errorEvent$=new St;chromecastConnector;static isSupported(){return`chrome`in window&&`presentation`in navigator&&`BroadcastChannel`in window}constructor(e){let t=Ot.isSupported();this.log=e.dependencies.logger.createComponentLog(`ChromecastPresentationApiInitializer`),this.log({message:`[constructor] receiverApplicationId: ${e.receiverApplicationId}, isDisabled: ${e.isDisabled}, isSupported: ${t}`}),!(!t||e.isDisabled||!e.receiverApplicationId)&&(this.chromecastConnector=new bt({appId:e.receiverApplicationId,logger:e.dependencies.logger}),this.subscribe())}subscribe(){Dt(this.chromecastConnector,`subscribe with null chromecastConnector`),this.subscription.add(this.chromecastConnector.errorEvent$.subscribe(this.errorEvent$));let e=Tt({connection:this.chromecastConnector.presentationConnection$,available:this.chromecastConnector.presentationAvailable$,friendlyName:this.chromecastConnector.friendlyName$.pipe(Et())});this.subscription.add(e.pipe(Ct(({connection:e,friendlyName:t})=>!!(e&&t)),Et()).subscribe(e=>{let t=this.chromecastConnector?.friendlyName$.getValue()??``;this.connection$.next(e?vt(t):void 0)})).add(e.subscribe(({available:e,connection:t})=>{e?t?this.castState$.next(`CONNECTED`):this.castState$.next(`AVAILABLE`):this.castState$.next(`NOT_AVAILABLE`)}))}connect(){this.log({message:`connect`}),this.chromecastConnector?.connect()}disconnect(){this.log({message:`disconnect`}),this.chromecastConnector?.disconnect()}async stopMedia(){this.log({message:`stopMedia`}),this.chromecastConnector?.stopMedia()}toggleConnection(){let e=!!this.chromecastConnector?.presentationConnection$.getValue();this.log({message:`toggleConnection: isConnected - ${e}`}),e?this.disconnect():this.connect()}setVolume(e){}setMuted(e){}destroy(){this.log({message:`destroy`}),this.chromecastConnector?.destroy(),this.subscription.unsubscribe()}}import{isNonNullable as kt,Subject as At,merge as jt}from"@vkontakte/videoplayer-shared";var Mt=(e,t)=>e===t;class Nt{comparator;state;prevState;transition;transitionStarted$=new At;transitionEnded$=new At;transitionUpdated$=new At;forceChanged$=new At;stateChangeStarted$=jt(this.transitionStarted$,this.transitionUpdated$);stateChangeEnded$=jt(this.transitionEnded$,this.forceChanged$);constructor(e,t=Mt){this.comparator=t,this.state=e,this.prevState=void 0}setState(e){let t=this.transition,n=this.state;this.transition=void 0,this.prevState=n,this.state=e,t?this.comparator(t.to,e)?this.transitionEnded$.next(t):this.forceChanged$.next({from:t.from,to:e,canceledTransition:t}):this.forceChanged$.next({from:n,to:e,canceledTransition:t})}startTransitionTo(e){let t=this.transition,n=this.state;this.comparator(n,e)||kt(t)&&this.comparator(t.to,e)||(this.prevState=n,this.state=e,t?(this.transition={from:t.from,to:e,canceledTransition:t},this.transitionUpdated$.next(this.transition)):(this.transition={from:n,to:e},this.transitionStarted$.next(this.transition)))}getTransition(){return this.transition}getState(){return this.state}getPrevState(){return this.prevState}}import{assertNever as Pt,debounce as Ft,ErrorCategory as It,fromEvent as Lt,map as Rt,merge as zt,observableFrom as Bt,Subject as Vt,Subscription as Ht,timeout as Ut}from"@vkontakte/videoplayer-shared";var Wt=5,Gt=5,Kt=500,qt=7e3;class Jt{subscription=new Ht;loadMediaTimeoutSubscription=new Ht;videoState=new Nt(`stopped`);params;log;constructor(e){this.params=e,this.log=this.params.dependencies.logger.createComponentLog(`ChromecastProvider`),this.log({message:`constructor, format: ${e.format}`}),this.params.output.isLive$.next(ot(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 Ht;this.subscription.add(e),this.subscription.add(zt(this.videoState.stateChangeStarted$.pipe(Rt(e=>`stateChangeStarted$ ${JSON.stringify(e)}`)),this.videoState.stateChangeEnded$.pipe(Rt(e=>`stateChangeEnded$ ${JSON.stringify(e)}`))).subscribe(e=>this.log({message:`[videoState] ${e}`})));let t=(e,t)=>this.subscription.add(e.subscribe(t));if(this.params.output.isLive$.getValue())this.params.output.position$.next(0),this.params.output.duration$.next(0);else{let t=new Vt;e.add(t.pipe(Ft(Kt)).subscribe(()=>{this.params.output.seekedEvent$.next()}));let n=NaN;e.add(Lt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.CURRENT_TIME_CHANGED).subscribe(e=>{this.logRemoteEvent(e);let r=e.value;this.params.output.position$.next(r),(this.params.desiredState.seekState.getState().state===`applying`||Math.abs(r-n)>Wt)&&t.next(r),n=r})),e.add(Lt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.DURATION_CHANGED).subscribe(e=>{this.logRemoteEvent(e),this.params.output.duration$.next(e.value)}))}t(Lt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MEDIA_LOADED_CHANGED),t=>{this.logRemoteEvent(t),t.value?this.handleRemoteReady():(this.handleRemoteStop(),e.unsubscribe())}),t(Lt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED),e=>{this.logRemoteEvent(e),e.value?this.handleRemotePause():this.handleRemotePlay()}),t(Lt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.PLAYER_STATE_CHANGED),e=>{this.logRemoteEvent(e);let{remotePlayer:t}=this.params.connection,n=e.value,r=this.params.output.isBuffering$.getValue(),i=n===chrome.cast.media.PlayerState.BUFFERING;switch(r!==i&&this.params.output.isBuffering$.next(i),n){case chrome.cast.media.PlayerState.IDLE:!this.params.output.isLive$.getValue()&&t.duration-t.currentTime<Gt&&this.params.output.endedEvent$.next(),this.handleRemoteStop(),A(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:Pt(n)}}),t(Lt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED),e=>{this.logRemoteEvent(e),this.handleRemoteVolumeChange({volume:e.value})}),t(Lt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED),e=>{this.logRemoteEvent(e),this.handleRemoteVolumeChange({muted:e.value})}),t(zt(this.params.desiredState.playbackState.stateChangeStarted$,this.params.desiredState.seekState.stateChangeEnded$,this.videoState.stateChangeEnded$,Bt([`init`])).pipe(Ft(0)),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`),A(this.params.desiredState.playbackState,`paused`)):(this.videoState.setState(`playing`),A(this.params.desiredState.playbackState,`playing`));let e=this.params.output.isLive$.getValue();this.params.output.duration$.next(e?0:t.duration),this.params.output.position$.next(e?0:t.currentTime),this.params.desiredState.seekState.setState({state:`none`})}}prepare(){let e=this.params.format;this.log({message:`[prepare] format: ${e}`});let t=ge(this.params),n=this.createLoadRequest(t);this.loadMedia(n)}handleRemotePause(){let e=this.videoState.getState();(this.videoState.getTransition()?.to===`paused`||e===`playing`)&&(this.videoState.setState(`paused`),A(this.params.desiredState.playbackState,`paused`))}handleRemotePlay(){let e=this.videoState.getState();(this.videoState.getTransition()?.to===`playing`||e===`paused`)&&(this.videoState.setState(`playing`),A(this.params.desiredState.playbackState,`playing`))}handleRemoteReady(){this.videoState.getTransition()?.to===`ready`&&this.videoState.setState(`ready`),this.params.desiredState.playbackState.getTransition()?.to===`ready`&&A(this.params.desiredState.playbackState,`ready`)}handleRemoteStop(){this.videoState.getState()!==`stopped`&&this.videoState.setState(`stopped`)}handleRemoteVolumeChange(e){let t=this.params.output.volume$.getValue(),n={volume:e.volume??t.volume,muted:e.muted??t.muted};(n.volume!==t.volume||n.muted!==n.muted)&&this.params.output.volume$.next(n)}seek(e){this.params.output.willSeekEvent$.next();let{remotePlayer:t,remotePlayerController:n}=this.params.connection;t.currentTime=e,n.seek()}stop(){let{remotePlayerController:e}=this.params.connection;e.stop()}createLoadRequest(e){let t=new chrome.cast.media.LoadRequest(e);t.autoplay=!1;let n=this.params.desiredState.seekState.getState();return n.state===`applying`||n.state===`requested`?t.currentTime=this.params.output.isLive$.getValue()?0:n.position/1e3:t.currentTime=0,t}loadMedia(e){let t=this.params.connection.session.loadMedia(e),n=new Promise((e,t)=>{this.loadMediaTimeoutSubscription.add(Ut(qt).subscribe(()=>t(`timeout(${qt})`)))});Promise.race([t,n]).then(()=>{this.log({message:`[loadMedia] completed, format: ${this.params.format}`}),this.params.desiredState.seekState.getState().state===`applying`&&this.params.output.seekedEvent$.next(),this.handleRemoteReady()},e=>{let t=`[prepare] loadMedia failed, format: ${this.params.format}, reason: ${e}`;this.log({message:t}),this.params.output.error$.next({id:`ChromecastProvider.loadMedia`,category:It.VIDEO_PIPELINE,message:t,thrown:e})}).finally(()=>{this.loadMediaTimeoutSubscription.unsubscribe()})}logRemoteEvent(e){this.log({message:`[remoteEvent] ${JSON.stringify(e)}`})}syncPlayback=()=>{let e=this.videoState.getState(),t=this.videoState.getTransition(),n=this.params.desiredState.playbackState.getState(),r=this.params.desiredState.playbackState.getTransition(),i=this.params.desiredState.seekState.getState();if(this.log({message:`[syncPlayback] videoState: ${e}; videoTransition: ${JSON.stringify(t)}; desiredPlaybackState: ${n}; desiredPlaybackStateTransition: ${this.params.desiredState.playbackState.getTransition()}; seekState: ${JSON.stringify(i)};`}),n===`stopped`){e!==`stopped`&&(this.videoState.startTransitionTo(`stopped`),this.stop());return}if(!t){if(r?.to!==`paused`&&i.state===`requested`&&e!==`stopped`){this.seek(i.position/1e3);return}switch(n){case`ready`:switch(e){case`playing`:case`paused`:case`ready`:break;case`stopped`:this.videoState.startTransitionTo(`ready`),this.prepare();break;default:Pt(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:Pt(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:Pt(e)}break;default:Pt(n)}}}}import{clearVideoElement as Yt,fromEvent as Xt,getWindow as Zt,Subscription as Qt}from"@vkontakte/videoplayer-shared";import{clearVideoElement as $t}from"@vkontakte/videoplayer-shared";var en=e=>{try{e.pause(),e.playbackRate=0,$t(e),e.remove()}catch(e){console.error(e)}},tn=`__spvc`;class nn{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)}}var rn=Zt(),an=rn.WeakMap?new rn.WeakMap:new nn,on=rn.WeakMap?new rn.WeakMap:new Map,sn=(e,t=20)=>{let n=0;return Xt(e,`ratechange`).subscribe(r=>{n++,n>=t&&(e.currentTime=e.currentTime,n=0)})};function cn(e){e.style.position=`fixed`,e.style.left=`100%`,e.setAttribute(`data-role`,`screen`),Zt().document.body.appendChild(e)}function ln(e,t){e.style.position=``,e.style.left=``,t.appendChild(e)}var un=(e,{audioVideoSyncRate:t,disableYandexPiP:n,reuseOwnVideoElement:r,reuseOwnVideoElementOnBackgroundTabOnly:i})=>{let a,o=e.querySelector(`video`),s=!!o,c=Zt().document.querySelector(`body > video[data-role=screen]`)||void 0;r&&!i?rn[tn]=c:(c?.remove(),delete rn[tn]),o?(a=o,Yt(a)):c&&c===rn[tn]?(a=c,ln(a,e)):(a=Zt().document.createElement(`video`),e.appendChild(a),r&&!i&&(rn[tn]=a)),an.set(a,s);let l=new Qt;return l.add(sn(a,t)),on.set(a,l),a.setAttribute(`crossorigin`,`anonymous`),a.setAttribute(`playsinline`,`playsinline`),n&&a.setAttribute(`x-yandex-pip`,`false`),a.controls=!1,a.setAttribute(`poster`,`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=`),a},dn=e=>(e.setAttribute(`crossorigin`,`anonymous`),e.controls=!1,e),fn=(e,t)=>{if(e instanceof HTMLAudioElement){pn(e,t);return}if(e instanceof HTMLVideoElement){mn(e,t);return}};function pn(e,{clearAudioElementOnDispose:t}){if(t){Yt(e);return}en(e)}function mn(e,{reuseOwnVideoElement:t,reuseOwnVideoElementOnBackgroundTabOnly:n}){on.get(e)?.unsubscribe(),on.delete(e);let r=an.get(e);an.delete(e),Yt(e),t&&!n&&!r&&cn(e)}import{isNonNullable as hn,map as gn,Subject as _n,Subscription as vn,ErrorCategory as yn}from"@vkontakte/videoplayer-shared";import{isNonNullable as bn,isNullable as xn,Subscription as Sn}from"@vkontakte/videoplayer-shared";var Cn=(e,t,n,{equal:r=(e,t)=>e===t,changed$:i,onError:a}={})=>{let o=e.getState(),s=t(),c=xn(i),l=new Sn;return i&&l.add(i.subscribe(t=>{r(t,e.getState())&&e.setState(t)},a)),r(s,o)||(n(o),c&&e.setState(o)),l.add(e.stateChangeStarted$.subscribe(t=>{n(t.to),c&&e.setState(t.to)},a)),l},wn=(e,t,n)=>Cn(t,()=>e.loop,t=>{bn(t)&&(e.loop=t)},{onError:n}),Tn=(e,t,n,r,i)=>Cn(t,()=>({muted:e.muted,volume:e.volume}),t=>{i?.skipVideoElVolumeSync$.getValue()||bn(t)&&(e.muted=t.muted,e.volume=t.volume)},{equal:(e,t)=>e===t||e?.muted===t?.muted&&e?.volume===t?.volume,changed$:n,onError:r}),En=(e,t,n,r)=>Cn(t,()=>e.playbackRate,t=>{bn(t)&&(e.playbackRate=t)},{changed$:n,onError:r}),Dn=Cn;class On{available$=new _n;error$=new _n;subscription=new vn;externalTracks=new Map;internalTracks=new Map;emittedIds;connect(e,t){let n=e=>{this.error$.next({id:`TextTracksManager`,category:yn.WTF,message:`Generic TextTrackManager error`,thrown:e})};this.subscription.add(this.available$.subscribe(t.availableTextTracks$)),this.subscription.add(this.error$.subscribe(t.error$)),this.emitAvailable(),this.subscription.add(Dn(e.internalTextTracks,()=>Array.from(this.internalTracks.values()),e=>{hn(e)&&this.setInternal(e)},{equal:(e,t)=>hn(e)&&hn(t)&&e.length===t.length&&e.every(({id:e},n)=>e===t[n].id),changed$:this.available$.pipe(gn(e=>e.filter(({type:e})=>e===`internal`))),onError:n})),this.subscription.add(Dn(e.externalTextTracks,()=>Array.from(this.externalTracks.values()),e=>{hn(e)&&this.setExternal(e)},{equal:(e,t)=>hn(e)&&hn(t)&&e.length===t.length&&e.every(({id:e},n)=>e===t[n].id),changed$:this.available$.pipe(gn(e=>e.filter(({type:e})=>e===`external`))),onError:n}))}setExternal(e){this.internalTracks.clear();for(let t of Array.from(this.externalTracks.keys()))e.some(e=>e.id===t)||this.externalTracks.delete(t);for(let t of e)this.externalTracks.has(t.id)||this.externalTracks.set(t.id,t);this.emitAvailable()}setInternal(e){let t=Array.from(this.externalTracks.values());for(let t of Array.from(this.internalTracks.keys()))e.some(e=>e.id===t)||this.internalTracks.delete(t);for(let n of e){let e=t.some(({language:e,isAuto:t})=>e===n.language&&t===n.isAuto);!this.internalTracks.has(n.id)&&!e&&this.internalTracks.set(n.id,n)}this.emitAvailable()}destroy(){this.subscription.unsubscribe(),this.externalTracks.clear(),this.internalTracks.clear()}emitAvailable(){let e=[...this.externalTracks.values(),...this.internalTracks.values()],t=e.map(({id:e})=>e),{emittedIds:n}=this;n&&n.length===t.length&&n.every((e,n)=>e===t[n])||(this.emittedIds=t,this.available$.next(e.map(e=>({...e,isAuto:e.isAuto??e.id.includes(`auto`)}))))}}var kn=On;class An{pausedTime=0;streamOffset=0;pauseTimestamp=0;getTotalPausedTime(){return this.pausedTime+this.getCurrentPausedTime()}getCurrentPausedTime(){return this.pauseTimestamp>0?Date.now()-this.pauseTimestamp:0}getStreamOffset(){return this.streamOffset}getTotalOffset(){return this.getTotalPausedTime()+this.streamOffset}pause(){this.pauseTimestamp===0&&(this.pauseTimestamp=Date.now())}resume(){this.pauseTimestamp>0&&(this.pausedTime+=this.getCurrentPausedTime(),this.pauseTimestamp=0)}resetTo(e,t=!1){this.streamOffset=e,this.pauseTimestamp=0,this.pausedTime=0,t&&this.pause()}}var jn=e=>{let t=e;for(;!(t instanceof Document)&&!(t instanceof ShadowRoot)&&t!==null;)t=t?.parentNode;return t??void 0},Mn=e=>{let t=jn(e);return!!(t&&t.fullscreenElement&&t.fullscreenElement===e)},Nn=e=>{let t=jn(e);return!!(t&&t.pictureInPictureElement&&t.pictureInPictureElement===e)};import{fromEvent as N,map as Pn,merge as Fn,filterChanged as In,isNonNullable as Ln,Subject as Rn,filter as zn,mapTo as Bn,combine as Vn,once as Hn,shareReplay as P,throttle as Un,ErrorCategory as Wn,ErrorOrigin as Gn,ValueSubject as Kn,Subscription as qn}from"@vkontakte/videoplayer-shared";var Jn=3,Yn=(e,t,n=Jn)=>{let r=0,i=0;for(let a=0;a<e.length;a++){let o=e.start(a),s=e.end(a);if(o<=t&&t<=s){if(r=o,i=s,!n)return{from:r,to:i};for(let t=a-1;t>=0;t--)e.end(t)+n>=r&&(r=e.start(t));for(let t=a+1;t<e.length;t++)e.start(t)-n<=i&&(i=e.end(t))}}return{from:r,to:i}},Xn=e=>{let t=0;for(let n=0;n<e.length;n++)t+=e.end(n)-e.start(n);return t},Zn=e=>{let t=0;for(let n=0;n<e.length;n++)t+=e.end(n)-e.start(n);return t*1e3},Qn=e=>{let t=t=>N(e,t).pipe(Bn(void 0),P(1)),n=new qn,r=()=>n.unsubscribe(),i=Fn(N(e,`progress`),N(e,`timeupdate`)),a=i.pipe(Pn(()=>Yn(e.buffered,e.currentTime)),P(1)),o=i.pipe(Pn(()=>Zn(e.buffered)),P(1)),s=i.pipe(Pn(()=>e.buffered.length),P(1)),c=M.browser.isSafari?Vn({play:t(`play`).pipe(Hn()),playing:t(`playing`)}).pipe(Bn(void 0),P(1)):t(`playing`),l=N(e,`volumechange`).pipe(Pn(()=>({muted:e.muted,volume:e.volume})),P(1)),u=N(e,`ratechange`).pipe(Pn(()=>e.playbackRate),P(1)),d=N(e,`error`).pipe(zn(()=>!!(e.error||e.played.length)),Pn(()=>{let t=e.error;return{id:t?`MediaError#${t.code}`:`HtmlVideoError`,category:Wn.VIDEO_PIPELINE,message:t?t.message:`Error event from HTML video element`,thrown:e.error??void 0,origin:Gn.MediaError,data:t?{code:t.code}:void 0}}),P(1)),f=N(e,`timeupdate`).pipe(Pn(()=>e.currentTime),P(1)),p=Fn(N(e,`loadedmetadata`),N(e,`timeupdate`),N(e,`pause`),N(e,`seeked`),N(e,`ended`)).pipe(Pn(()=>Xn(e.played)),In(),P(1)),m=[`waiting`,`seeking`,`seeked`,`timeupdate`],h=new Rn,g=.3,_;n.add(Fn(...m.map(t=>N(e,t))).subscribe(t=>{let n=e.currentTime;e.loop&&Ln(_)&&Ln(n)&&_>=e.duration-g&&n<=g&&h.next(_),_=n}));let v=t(`pause`).pipe(zn(()=>!e.error&&_!==e.duration),P(1)),y=N(e,`enterpictureinpicture`).pipe(P(1)),b=N(e,`leavepictureinpicture`).pipe(P(1)),x=new Kn(Nn(e));n.add(y.subscribe(()=>x.next(!0))),n.add(b.subscribe(()=>x.next(!1)));let S=new Kn(Mn(e)),C=N(e,`fullscreenchange`).pipe(P(1));n.add(C.pipe(Pn(()=>Mn(e))).subscribe(S));let ee=N(e,`timeupdate`).pipe(Pn(t=>e.duration-e.currentTime<.1),In(),P(1)),w=Fn(ee.pipe(zn(t=>!e.loop&&t)),N(e,`ended`)).pipe(Un(1e3),Bn(void 0),P(1)),T=Fn(...[`waiting`,`pause`,`canplay`,`play`,`canplaythrough`,`playing`,`seeking`,`seeked`,`ended`].map(t=>N(e,t)),ee.pipe(Pn(e=>({type:e?`ended`:`unknown`})))).pipe(Pn(t=>M.browser.isFirefox&&t.type===`ended`?e.readyState<2:e.readyState<3),In(),P(1));return{playing$:c,pause$:v,canplay$:t(`canplay`),ended$:w,looped$:h,error$:d,seeked$:t(`seeked`),seeking$:t(`seeking`),progress$:t(`progress`),loadStart$:t(`loadstart`),loadedMetadata$:t(`loadedmetadata`),loadedData$:t(`loadeddata`),timeUpdate$:f,durationChange$:N(e,`durationchange`).pipe(Pn(()=>e.duration),P(1)),playedTime$:p,isBuffering$:T,currentBuffer$:a,totalBufferDuration$:o,bufferRangeCount$:s,volumeState$:l,playbackRateState$:u,inPiP$:x,inFullscreen$:S,enterPip$:y,leavePip$:b,destroy:r}};import{VideoQuality as $n}from"@vkontakte/videoplayer-shared";var er=e=>{switch(e){case`mobile`:return $n.Q_144P;case`lowest`:return $n.Q_240P;case`low`:return $n.Q_360P;case`sd`:case`medium`:return $n.Q_480P;case`hd`:case`high`:return $n.Q_720P;case`fullhd`:case`full`:return $n.Q_1080P;case`quadhd`:case`quad`:return $n.Q_1440P;case`ultrahd`:case`ultra`:return $n.Q_2160P}};import{assertNotEmptyArray as tr,getWindow as nr,isInvariantQuality as rr,ValueSubject as ir}from"@vkontakte/videoplayer-shared";var ar=e=>`audioTracksAsc`in e;import{now as or}from"@vkontakte/videoplayer-shared";class sr{last;history={};recordSelection(e){this.history[e.id]=or()}recordSwitch(e){this.last=e}clear(){this.last=void 0,this.history={}}}import{flattenObject as cr,isInvariantQuality as lr,isLowerOrEqual as ur,isNonNullable as dr,now as fr}from"@vkontakte/videoplayer-shared";import{isLowerOrEqual as pr,isNonNullable as mr,isNullable as hr}from"@vkontakte/videoplayer-shared";var gr=(e,t)=>(e??0)/(t>0?t:1),_r=e=>`quality`in e,vr=e=>(t,n)=>e*(Number(t.bitrate)-Number(n.bitrate)),yr=e=>(t,n)=>e*(pr(t.quality,n.quality)?-1:1),br=e=>(t,n)=>_r(t)&&_r(n)?yr(e)(t,n):vr(e)(t,n),xr=(e,t)=>br(1)(e,t)<0,Sr=(e,t)=>Math.log(t)/Math.log(e),Cr=(e,t,n)=>(t-n)*2**(-10*e)+n,wr=(e,t,n,r)=>{if(hr(e))return n[0];let i=n.filter(t=>mr(t.bitrate)&&mr(e.bitrate)?e.bitrate/t.bitrate>r:!0),a=n.at(Math.round(n.length*t.indexOf(e)/(t.length+1)))??n.at(-1);return a&&i.includes(a)?a:i.length?i.at(-1):n.at(0)},Tr=(e,t)=>{if(hr(t)||hr(e))return;let n=e.get(t.id);if(!n?.length)return;let r=(n[n.length-1].time.to-n[0].time.from)/1e3;if(r<=0)return;let i=n.reduce((e,t)=>e+(t.size??1/0),0)*8/1024/r;return isFinite(i)?i:void 0},Er=(e,t)=>mr(e)&&mr(t)&&t>0&&e>0&&e<=t*2,Dr=({name:e,...t})=>`
|
|
7
7
|
${e}
|
|
8
8
|
${Object.entries(t).map(([e,t])=>` ${e}: ${t}`).join(`
|
|
9
9
|
`)}
|