@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/evergreen.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/evergreen";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/evergreen";import{assertNever as se,assertNonNullable as ce,ErrorCategory as le,getHighestQuality as ue,isNonNullable as de}from"@vkontakte/videoplayer-shared/evergreen";import{assertNever as fe}from"@vkontakte/videoplayer-shared/evergreen";var pe=`_offset_p`,me=e=>{if(e.includes(pe))return!0;try{return new URL(e).searchParams.has(`offset_p`)}catch{return!1}},he=(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},ge=(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)}},_e=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=ve();break}case`HLS`:case`HLS_FMP4`:case`HLS_ONDEMAND`:{let e=t[n];ce(e),a=e.url,o=`application/x-mpegurl`,s=ve();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=ve();break}case`DASH_LIVE_CMAF`:{let e=t[n];ce(e),a=e.url,o=`application/dash+xml`,s=ye();break}case`HLS_LIVE`:case`HLS_LIVE_CMAF`:{let e=t[n];ce(e),a=he(e.url),o=`application/x-mpegurl`,s=ye();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=be(r.videoId??a,o);c.contentUrl=a,c.streamType=s,c.metadata=xe();let{title:l,subtitle:u}=r;return de(l)&&(c.metadata.title=l),de(u)&&(c.metadata.subtitle=u),c};function ve(){return chrome.cast?.media?.StreamType?.BUFFERED??`BUFFERED`}function ye(){return chrome.cast?.media?.StreamType?.LIVE??`LIVE`}function be(e,t){return chrome.cast?.media?.MediaInfo?new chrome.cast.media.MediaInfo(e,t):{contentId:e,contentType:t,metadata:{title:``,subtitle:``},streamType:ve()}}function xe(){return chrome.cast?.media?.GenericMediaMetadata?new chrome.cast.media.GenericMediaMetadata:{images:[],metadataType:0,releaseDate:``,subtitle:``,title:``,releaseYear:1970,type:0}}var k=(e,t,n=!1)=>{let r=e.getTransition();(n||!r||r.to===t)&&e.setState(t)};import{createTimers as Se,TimerModule as Ce}from"@vkontakte/videoplayer-shared/evergreen";var A=Se(Ce.CORE);class we{params;interval=0;startVideoPosition;startTs;constructor(e){this.params=e}start(e=0){A.clearInterval(this.interval),this.startVideoPosition=e,this.startTs=Date.now(),this.interval=A.setInterval(()=>{let e=(Date.now()-this.startTs)/1e3,t=this.startVideoPosition+e;this.params.output.position$.next(t)},1e3)}pause(){A.clearInterval(this.interval)}destroy(){A.clearInterval(this.interval)}}import{assertNever as Te}from"@vkontakte/videoplayer-shared/evergreen";import{isBrowserWindow as Ee,ValueSubject as De}from"@vkontakte/videoplayer-shared/evergreen";import{getWindow as Oe,isNullable as ke}from"@vkontakte/videoplayer-shared/evergreen";class Ae{_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}=Oe().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+)/),ke(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 je,isBrowserWindow as Me}from"@vkontakte/videoplayer-shared/evergreen";var Ne=()=>/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(navigator.appVersion??navigator.userAgent)||navigator?.userAgentData?.mobile;class Pe{_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=je();if(!Me(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=je();if(!Me(e))return;let{userAgent:t}=e.navigator;try{this._isMobile=Ne()}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=je();if(Me(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=je();if(!Me(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=je();if(!Me(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=je();if(!Me(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 Fe,isBrowserWindow as Ie}from"@vkontakte/videoplayer-shared/evergreen";var Le=[`rec2020`,`p3`,`srgb`],Re=[`standalone`,`minimal-ui`,`fullscreen`,`window-controls-overlay`,`picture-in-picture`];class ze{_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 Fe()}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=Fe();if(!Ie(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 Le.find(t=>e.matchMedia?.(`(color-gamut: ${t})`)?.matches)}detectDisplayMode(e){return Re.find(t=>e.matchMedia?.(`(display-mode: ${t})`)?.matches)??`browser`}}import{getWindow as Be,isBrowserWindow as Ve}from"@vkontakte/videoplayer-shared/evergreen";var He=()=>window.ManagedMediaSource||window.MediaSource,Ue=()=>!!(window.ManagedMediaSource&&window.ManagedSourceBuffer?.prototype?.appendBuffer),We=()=>!!(window.MediaSource&&window.SourceBuffer?.prototype?.appendBuffer),Ge=()=>window.ManagedMediaSource?new ManagedMediaSource:new MediaSource,Ke=Be().document?.createElement(`video`),qe=`video/mp4; codecs="avc1.42000a,mp4a.40.2"`,Je=`video/mp4; codecs="hev1.1.6.L93.B0"`,Ye=`video/webm; codecs="vp09.00.10.08"`,Xe=`video/webm; codecs="av01.0.00M.08"`,Ze=`audio/mp4; codecs="mp4a.40.2"`,Qe=`audio/webm; codecs="opus"`,$e;(async()=>{let e=Be();if(!Ve(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:Xe}}),e.navigator.mediaCapabilities.decodingInfo({...t,video:{...t.video,contentType:Ye}})]);$e={DASH_WEBM_AV1:n,DASH_WEBM:r}})().catch(e=>{console.log(Ke),console.error(e)});class et{_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 $e}get supportedCodecs(){return Object.keys(this._codecs).filter(e=>this._codecs[e])}get nativeHlsSupported(){return this._nativeHlsSupported}detect(){let e=Be();if(!Ve(e))return;let t=e.document;this._video=t.createElement(`video`);try{this._protocols={mms:Ue(),mse:We(),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=!!He()?.isTypeSupported?.(qe),n=!!He()?.isTypeSupported?.(Je),r=!!He()?.isTypeSupported?.(Ze);this._codecs={h264:t,h265:n,vp9:!!He()?.isTypeSupported?.(Ye),av1:!!He()?.isTypeSupported?.(Xe),aac:r,opus:!!He()?.isTypeSupported?.(Qe),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 tt,isBrowserWindow as nt}from"@vkontakte/videoplayer-shared/evergreen";var rt=`audio/mpeg`;class it{_audio;_containers;_codecs;supportMp3(){return this._codecs.mp3&&this._containers.mpeg}detect(){let e=tt();if(!nt(e))return;let t=e.document;this._audio=t.createElement(`audio`);try{this._containers={mpeg:!!this._audio.canPlayType?.(rt)},this._codecs={mp3:!!He()?.isTypeSupported?.(rt)}}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 at{isInited$=new De(!1);_displayChecker;_deviceChecker;_browserChecker;_videoChecker;_audioChecker;constructor(){this._displayChecker=new ze,this._deviceChecker=new Pe(this._displayChecker),this._browserChecker=new Ae,this._videoChecker=new et(this._deviceChecker,this._browserChecker),this._audioChecker=new it,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(){Ee()&&(this._displayChecker.detect(),this._deviceChecker.detect(),this._browserChecker.detect(),this._videoChecker.detect(),this._audioChecker.detect(),this.isInited$.next(!0))}}var j=new at,ot=(e,t=!1)=>{let{containers:n,protocols:r,codecs:i,nativeHlsSupported:a}=j.video,{isMobile:o}=j.device,s=j.device.isMac&&j.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 Te(e)}})},st=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 Te(e)}},ct=(e,t=!1)=>ot(Object.keys(e).filter(e=>!st(e)),t).length>0;class lt{subscription=new ae;log;params;sessionId$=new oe(null);mediaSessionId$=new oe(null);contentId$=new oe(null);progressTicker;isMobile=Ne();mobileVolumeState={muted:!1,volume:0};media=null;lastRequestedVolume=null;constructor(e){this.params=e,this.progressTicker=new we(e),this.log=this.params.dependencies.logger.createComponentLog(`ChromecastPresentationApiProvider`),this.log({message:`constructor, format: ${e.format}`}),this.params.output.isLive$.next(st(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=_e(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`:k(this.params.desiredState.playbackState,`paused`);break;case`PLAYING`:k(this.params.desiredState.playbackState,`playing`);break;case`IDLE`:t===`FINISHED`?(this.params.output.endedEvent$.next(),k(this.params.desiredState.playbackState,`stopped`),this.contentId$.next(null)):k(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 ut,ErrorCategory as dt,filter as ft,Subject as pt,Subscription as mt,tap as ht,ValueSubject as gt,fromEvent as _t,getWindow as vt}from"@vkontakte/videoplayer-shared/evergreen";var yt=e=>({castDevice:{friendlyName:e},remotePlayer:{},remotePlayerController:{},session:{}}),bt=()=>String(Date.now())+String(Math.floor(Math.random()*1e5));class xt{params;clientId;capabilities=[`WEB`];presentationRequest$=new gt(null);log;sessionId$=new gt(null);broadcastChannel=new BroadcastChannel(`vk_player_chromecast_events`);subscription=new mt;subscriptionEvents=new mt;isDestroyed=!1;sequenceNumber=0;presentationAvailable$=new gt(!1);presentationConnection$=new gt(null);message$=new gt(null);friendlyName$=new gt(null);errorEvent$=new pt;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(_t(e,`change`).subscribe(()=>{t()})),t()}).catch(()=>{this.presentationAvailable$.next(!0)}),vt().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:dt.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();ut(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:dt.WTF,id:`ChromecastPresentationApiConnector`,message:e?.message??`connect error`,thrown:e});break}}}subscribe(){this.subscription.add(_t(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(ht(e=>{this.log({message:`presentationConnection$: ${!!e}`})}),ft(e=>!!e)).subscribe(e=>{let t=_t(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=_t(e,`connect`).subscribe(()=>{this.send(`client_connect`)}),r=_t(e,`close`).subscribe(e=>{switch(e.reason){case`error`:this.errorEvent$.next({category:dt.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:dt.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 vt()[e]=vt()[e]||bt()}resetSubscriptionEvents(){this.subscriptionEvents.unsubscribe(),this.subscriptionEvents=new mt}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 St,Subject as Ct,map as wt,Subscription as Tt,combine as Et,filterChanged as Dt,assertNonNullable as Ot}from"@vkontakte/videoplayer-shared/evergreen";class kt{subscription=new Tt;log;contentId;connection$=new St(void 0);castState$=new St(`NOT_AVAILABLE`);errorEvent$=new Ct;chromecastConnector;static isSupported(){return`chrome`in window&&`presentation`in navigator&&`BroadcastChannel`in window}constructor(e){let t=kt.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 xt({appId:e.receiverApplicationId,logger:e.dependencies.logger}),this.subscribe())}subscribe(){Ot(this.chromecastConnector,`subscribe with null chromecastConnector`),this.subscription.add(this.chromecastConnector.errorEvent$.subscribe(this.errorEvent$));let e=Et({connection:this.chromecastConnector.presentationConnection$,available:this.chromecastConnector.presentationAvailable$,friendlyName:this.chromecastConnector.friendlyName$.pipe(Dt())});this.subscription.add(e.pipe(wt(({connection:e,friendlyName:t})=>!!(e&&t)),Dt()).subscribe(e=>{let t=this.chromecastConnector?.friendlyName$.getValue()??``;this.connection$.next(e?yt(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 At,Subject as jt,merge as Mt}from"@vkontakte/videoplayer-shared/evergreen";var Nt=(e,t)=>e===t;class Pt{comparator;state;prevState;transition;transitionStarted$=new jt;transitionEnded$=new jt;transitionUpdated$=new jt;forceChanged$=new jt;stateChangeStarted$=Mt(this.transitionStarted$,this.transitionUpdated$);stateChangeEnded$=Mt(this.transitionEnded$,this.forceChanged$);constructor(e,t=Nt){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)||At(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 Ft,debounce as It,ErrorCategory as Lt,fromEvent as Rt,map as zt,merge as Bt,observableFrom as Vt,Subject as Ht,Subscription as Ut,timeout as Wt}from"@vkontakte/videoplayer-shared/evergreen";var Gt=5,Kt=5,qt=500,Jt=7e3;class Yt{subscription=new Ut;loadMediaTimeoutSubscription=new Ut;videoState=new Pt(`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(st(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 Ut;this.subscription.add(e),this.subscription.add(Bt(this.videoState.stateChangeStarted$.pipe(zt(e=>`stateChangeStarted$ ${JSON.stringify(e)}`)),this.videoState.stateChangeEnded$.pipe(zt(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 Ht;e.add(t.pipe(It(qt)).subscribe(()=>{this.params.output.seekedEvent$.next()}));let n=NaN;e.add(Rt(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)>Gt)&&t.next(r),n=r})),e.add(Rt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.DURATION_CHANGED).subscribe(e=>{this.logRemoteEvent(e),this.params.output.duration$.next(e.value)}))}t(Rt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MEDIA_LOADED_CHANGED),t=>{this.logRemoteEvent(t),t.value?this.handleRemoteReady():(this.handleRemoteStop(),e.unsubscribe())}),t(Rt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED),e=>{this.logRemoteEvent(e),e.value?this.handleRemotePause():this.handleRemotePlay()}),t(Rt(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<Kt&&this.params.output.endedEvent$.next(),this.handleRemoteStop(),k(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:Ft(n)}}),t(Rt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED),e=>{this.logRemoteEvent(e),this.handleRemoteVolumeChange({volume:e.value})}),t(Rt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED),e=>{this.logRemoteEvent(e),this.handleRemoteVolumeChange({muted:e.value})}),t(Bt(this.params.desiredState.playbackState.stateChangeStarted$,this.params.desiredState.seekState.stateChangeEnded$,this.videoState.stateChangeEnded$,Vt([`init`])).pipe(It(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`),k(this.params.desiredState.playbackState,`paused`)):(this.videoState.setState(`playing`),k(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=_e(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`),k(this.params.desiredState.playbackState,`paused`))}handleRemotePlay(){let e=this.videoState.getState();(this.videoState.getTransition()?.to===`playing`||e===`paused`)&&(this.videoState.setState(`playing`),k(this.params.desiredState.playbackState,`playing`))}handleRemoteReady(){this.videoState.getTransition()?.to===`ready`&&this.videoState.setState(`ready`),this.params.desiredState.playbackState.getTransition()?.to===`ready`&&k(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(Wt(Jt).subscribe(()=>t(`timeout(${Jt})`)))});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:Lt.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:Ft(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:Ft(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:Ft(e)}break;default:Ft(n)}}}}import{clearVideoElement as Xt,fromEvent as Zt,getWindow as Qt,Subscription as $t}from"@vkontakte/videoplayer-shared/evergreen";import{clearVideoElement as en}from"@vkontakte/videoplayer-shared/evergreen";var tn=e=>{try{e.pause(),e.playbackRate=0,en(e),e.remove()}catch(e){console.error(e)}},nn=`__spvc`;class rn{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 an=Qt(),on=an.WeakMap?new an.WeakMap:new rn,sn=an.WeakMap?new an.WeakMap:new Map,cn=(e,t=20)=>{let n=0;return Zt(e,`ratechange`).subscribe(r=>{n++,n>=t&&(e.currentTime=e.currentTime,n=0)})};function ln(e){e.style.position=`fixed`,e.style.left=`100%`,e.setAttribute(`data-role`,`screen`),Qt().document.body.appendChild(e)}function un(e,t){e.style.position=``,e.style.left=``,t.appendChild(e)}var dn=(e,{audioVideoSyncRate:t,disableYandexPiP:n,reuseOwnVideoElement:r,reuseOwnVideoElementOnBackgroundTabOnly:i})=>{let a,o=e.querySelector(`video`),s=!!o,c=Qt().document.querySelector(`body > video[data-role=screen]`)||void 0;r&&!i?an[nn]=c:(c?.remove(),delete an[nn]),o?(a=o,Xt(a)):c&&c===an[nn]?(a=c,un(a,e)):(a=Qt().document.createElement(`video`),e.appendChild(a),r&&!i&&(an[nn]=a)),on.set(a,s);let l=new $t;return l.add(cn(a,t)),sn.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},fn=e=>(e.setAttribute(`crossorigin`,`anonymous`),e.controls=!1,e),pn=(e,t)=>{if(e instanceof HTMLAudioElement){mn(e,t);return}if(e instanceof HTMLVideoElement){hn(e,t);return}};function mn(e,{clearAudioElementOnDispose:t}){if(t){Xt(e);return}tn(e)}function hn(e,{reuseOwnVideoElement:t,reuseOwnVideoElementOnBackgroundTabOnly:n}){sn.get(e)?.unsubscribe(),sn.delete(e);let r=on.get(e);on.delete(e),Xt(e),t&&!n&&!r&&ln(e)}import{isNonNullable as gn,map as _n,Subject as vn,Subscription as yn,ErrorCategory as bn}from"@vkontakte/videoplayer-shared/evergreen";import{isNonNullable as xn,isNullable as Sn,Subscription as Cn}from"@vkontakte/videoplayer-shared/evergreen";var wn=(e,t,n,{equal:r=(e,t)=>e===t,changed$:i,onError:a}={})=>{let o=e.getState(),s=t(),c=Sn(i),l=new Cn;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},Tn=(e,t,n)=>wn(t,()=>e.loop,t=>{xn(t)&&(e.loop=t)},{onError:n}),En=(e,t,n,r,i)=>wn(t,()=>({muted:e.muted,volume:e.volume}),t=>{i?.skipVideoElVolumeSync$.getValue()||xn(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}),Dn=(e,t,n,r)=>wn(t,()=>e.playbackRate,t=>{xn(t)&&(e.playbackRate=t)},{changed$:n,onError:r}),On=wn;class kn{available$=new vn;error$=new vn;subscription=new yn;externalTracks=new Map;internalTracks=new Map;emittedIds;connect(e,t){let n=e=>{this.error$.next({id:`TextTracksManager`,category:bn.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(On(e.internalTextTracks,()=>Array.from(this.internalTracks.values()),e=>{gn(e)&&this.setInternal(e)},{equal:(e,t)=>gn(e)&&gn(t)&&e.length===t.length&&e.every(({id:e},n)=>e===t[n].id),changed$:this.available$.pipe(_n(e=>e.filter(({type:e})=>e===`internal`))),onError:n})),this.subscription.add(On(e.externalTextTracks,()=>Array.from(this.externalTracks.values()),e=>{gn(e)&&this.setExternal(e)},{equal:(e,t)=>gn(e)&&gn(t)&&e.length===t.length&&e.every(({id:e},n)=>e===t[n].id),changed$:this.available$.pipe(_n(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 An=kn;class jn{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 Mn=e=>{let t=e;for(;!(t instanceof Document)&&!(t instanceof ShadowRoot)&&t!==null;)t=t?.parentNode;return t??void 0},Nn=e=>{let t=Mn(e);return!!(t&&t.fullscreenElement&&t.fullscreenElement===e)},Pn=e=>{let t=Mn(e);return!!(t&&t.pictureInPictureElement&&t.pictureInPictureElement===e)};import{fromEvent as M,map as Fn,merge as In,filterChanged as Ln,isNonNullable as Rn,Subject as zn,filter as Bn,mapTo as Vn,combine as Hn,once as Un,shareReplay as N,throttle as Wn,ErrorCategory as Gn,ErrorOrigin as Kn,ValueSubject as qn,Subscription as Jn}from"@vkontakte/videoplayer-shared/evergreen";var Yn=3,Xn=(e,t,n=Yn)=>{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}},Zn=e=>{let t=0;for(let n=0;n<e.length;n++)t+=e.end(n)-e.start(n);return t},Qn=e=>{let t=0;for(let n=0;n<e.length;n++)t+=e.end(n)-e.start(n);return t*1e3},$n=e=>{let t=t=>M(e,t).pipe(Vn(void 0),N(1)),n=new Jn,r=()=>n.unsubscribe(),i=In(M(e,`progress`),M(e,`timeupdate`)),a=i.pipe(Fn(()=>Xn(e.buffered,e.currentTime)),N(1)),o=i.pipe(Fn(()=>Qn(e.buffered)),N(1)),s=i.pipe(Fn(()=>e.buffered.length),N(1)),c=j.browser.isSafari?Hn({play:t(`play`).pipe(Un()),playing:t(`playing`)}).pipe(Vn(void 0),N(1)):t(`playing`),l=M(e,`volumechange`).pipe(Fn(()=>({muted:e.muted,volume:e.volume})),N(1)),u=M(e,`ratechange`).pipe(Fn(()=>e.playbackRate),N(1)),d=M(e,`error`).pipe(Bn(()=>!!(e.error||e.played.length)),Fn(()=>{let t=e.error;return{id:t?`MediaError#${t.code}`:`HtmlVideoError`,category:Gn.VIDEO_PIPELINE,message:t?t.message:`Error event from HTML video element`,thrown:e.error??void 0,origin:Kn.MediaError,data:t?{code:t.code}:void 0}}),N(1)),f=M(e,`timeupdate`).pipe(Fn(()=>e.currentTime),N(1)),p=In(M(e,`loadedmetadata`),M(e,`timeupdate`),M(e,`pause`),M(e,`seeked`),M(e,`ended`)).pipe(Fn(()=>Zn(e.played)),Ln(),N(1)),m=[`waiting`,`seeking`,`seeked`,`timeupdate`],h=new zn,g=.3,_;n.add(In(...m.map(t=>M(e,t))).subscribe(t=>{let n=e.currentTime;e.loop&&Rn(_)&&Rn(n)&&_>=e.duration-g&&n<=g&&h.next(_),_=n}));let v=t(`pause`).pipe(Bn(()=>!e.error&&_!==e.duration),N(1)),y=M(e,`enterpictureinpicture`).pipe(N(1)),b=M(e,`leavepictureinpicture`).pipe(N(1)),x=new qn(Pn(e));n.add(y.subscribe(()=>x.next(!0))),n.add(b.subscribe(()=>x.next(!1)));let S=new qn(Nn(e)),C=M(e,`fullscreenchange`).pipe(N(1));n.add(C.pipe(Fn(()=>Nn(e))).subscribe(S));let ee=M(e,`timeupdate`).pipe(Fn(t=>e.duration-e.currentTime<.1),Ln(),N(1)),w=In(ee.pipe(Bn(t=>!e.loop&&t)),M(e,`ended`)).pipe(Wn(1e3),Vn(void 0),N(1)),T=In(...[`waiting`,`pause`,`canplay`,`play`,`canplaythrough`,`playing`,`seeking`,`seeked`,`ended`].map(t=>M(e,t)),ee.pipe(Fn(e=>({type:e?`ended`:`unknown`})))).pipe(Fn(t=>j.browser.isFirefox&&t.type===`ended`?e.readyState<2:e.readyState<3),Ln(),N(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$:M(e,`durationchange`).pipe(Fn(()=>e.duration),N(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 er}from"@vkontakte/videoplayer-shared/evergreen";var tr=e=>{switch(e){case`mobile`:return er.Q_144P;case`lowest`:return er.Q_240P;case`low`:return er.Q_360P;case`sd`:case`medium`:return er.Q_480P;case`hd`:case`high`:return er.Q_720P;case`fullhd`:case`full`:return er.Q_1080P;case`quadhd`:case`quad`:return er.Q_1440P;case`ultrahd`:case`ultra`:return er.Q_2160P}};import{assertNotEmptyArray as nr,getWindow as rr,isInvariantQuality as ir,ValueSubject as ar}from"@vkontakte/videoplayer-shared/evergreen";var or=e=>`audioTracksAsc`in e;import{now as sr}from"@vkontakte/videoplayer-shared/evergreen";class cr{last;history={};recordSelection(e){this.history[e.id]=sr()}recordSwitch(e){this.last=e}clear(){this.last=void 0,this.history={}}}import{flattenObject as lr,isInvariantQuality as ur,isLowerOrEqual as dr,isNonNullable as fr,now as pr}from"@vkontakte/videoplayer-shared/evergreen";import{isLowerOrEqual as mr,isNonNullable as hr,isNullable as gr}from"@vkontakte/videoplayer-shared/evergreen";var _r=(e,t)=>(e??0)/(t>0?t:1),vr=e=>`quality`in e,yr=e=>(t,n)=>e*(Number(t.bitrate)-Number(n.bitrate)),br=e=>(t,n)=>e*(mr(t.quality,n.quality)?-1:1),xr=e=>(t,n)=>vr(t)&&vr(n)?br(e)(t,n):yr(e)(t,n),Sr=(e,t)=>xr(1)(e,t)<0,Cr=(e,t)=>Math.log(t)/Math.log(e),wr=(e,t,n)=>(t-n)*2**(-10*e)+n,Tr=(e,t,n,r)=>{if(gr(e))return n[0];let i=n.filter(t=>hr(t.bitrate)&&hr(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)},Er=(e,t)=>{if(gr(t)||gr(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},Dr=(e,t)=>hr(e)&&hr(t)&&t>0&&e>0&&e<=t*2,Or=({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/evergreen";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/evergreen";import{assertNever as se,assertNonNullable as ce,ErrorCategory as le,getHighestQuality as ue,isNonNullable as de}from"@vkontakte/videoplayer-shared/evergreen";import{assertNever as fe}from"@vkontakte/videoplayer-shared/evergreen";var pe=`_offset_p`,me=e=>{if(e.includes(pe))return!0;try{return new URL(e).searchParams.has(`offset_p`)}catch{return!1}},he=(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},ge=(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)}},_e=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=ve();break}case`HLS`:case`HLS_FMP4`:case`HLS_ONDEMAND`:{let e=t[n];ce(e),a=e.url,o=`application/x-mpegurl`,s=ve();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=ve();break}case`DASH_LIVE_CMAF`:{let e=t[n];ce(e),a=e.url,o=`application/dash+xml`,s=ye();break}case`HLS_LIVE`:case`HLS_LIVE_CMAF`:{let e=t[n];ce(e),a=he(e.url),o=`application/x-mpegurl`,s=ye();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=be(r.videoId??a,o);c.contentUrl=a,c.streamType=s,c.metadata=xe();let{title:l,subtitle:u}=r;return de(l)&&(c.metadata.title=l),de(u)&&(c.metadata.subtitle=u),c};function ve(){return chrome.cast?.media?.StreamType?.BUFFERED??`BUFFERED`}function ye(){return chrome.cast?.media?.StreamType?.LIVE??`LIVE`}function be(e,t){return chrome.cast?.media?.MediaInfo?new chrome.cast.media.MediaInfo(e,t):{contentId:e,contentType:t,metadata:{title:``,subtitle:``},streamType:ve()}}function xe(){return chrome.cast?.media?.GenericMediaMetadata?new chrome.cast.media.GenericMediaMetadata:{images:[],metadataType:0,releaseDate:``,subtitle:``,title:``,releaseYear:1970,type:0}}var k=(e,t,n=!1)=>{let r=e.getTransition();(n||!r||r.to===t)&&e.setState(t)};import{createTimers as Se,TimerModule as Ce}from"@vkontakte/videoplayer-shared/evergreen";var A=Se(Ce.CORE);class we{params;interval=0;startVideoPosition;startTs;constructor(e){this.params=e}start(e=0){A.clearInterval(this.interval),this.startVideoPosition=e,this.startTs=Date.now(),this.interval=A.setInterval(()=>{let e=(Date.now()-this.startTs)/1e3,t=this.startVideoPosition+e;this.params.output.position$.next(t)},1e3)}pause(){A.clearInterval(this.interval)}destroy(){A.clearInterval(this.interval)}}import{assertNever as Te}from"@vkontakte/videoplayer-shared/evergreen";import{isBrowserWindow as Ee,ValueSubject as De}from"@vkontakte/videoplayer-shared/evergreen";import{getWindow as Oe,isNullable as ke}from"@vkontakte/videoplayer-shared/evergreen";class Ae{_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}=Oe().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+)/),ke(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 je,isBrowserWindow as Me}from"@vkontakte/videoplayer-shared/evergreen";var Ne=()=>/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(navigator.appVersion??navigator.userAgent)||navigator?.userAgentData?.mobile;class Pe{_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=je();if(!Me(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=je();if(!Me(e))return;let{userAgent:t}=e.navigator;try{this._isMobile=Ne()}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=je();if(Me(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=je();if(!Me(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=je();if(!Me(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=je();if(!Me(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 Fe,isBrowserWindow as Ie}from"@vkontakte/videoplayer-shared/evergreen";var Le=[`rec2020`,`p3`,`srgb`],Re=[`standalone`,`minimal-ui`,`fullscreen`,`window-controls-overlay`,`picture-in-picture`];class ze{_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 Fe()}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=Fe();if(!Ie(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 Le.find(t=>e.matchMedia?.(`(color-gamut: ${t})`)?.matches)}detectDisplayMode(e){return Re.find(t=>e.matchMedia?.(`(display-mode: ${t})`)?.matches)??`browser`}}import{getWindow as Be,isBrowserWindow as Ve}from"@vkontakte/videoplayer-shared/evergreen";var He=()=>window.ManagedMediaSource||window.MediaSource,Ue=()=>!!(window.ManagedMediaSource&&window.ManagedSourceBuffer?.prototype?.appendBuffer),We=()=>!!(window.MediaSource&&window.SourceBuffer?.prototype?.appendBuffer),Ge=()=>window.ManagedMediaSource?new ManagedMediaSource:new MediaSource,Ke=Be().document?.createElement(`video`),qe=`video/mp4; codecs="avc1.42000a,mp4a.40.2"`,Je=`video/mp4; codecs="hev1.1.6.L93.B0"`,Ye=`video/webm; codecs="vp09.00.10.08"`,Xe=`video/webm; codecs="av01.0.00M.08"`,Ze=`audio/mp4; codecs="mp4a.40.2"`,Qe=`audio/webm; codecs="opus"`,$e;(async()=>{let e=Be();if(!Ve(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:Xe}}),e.navigator.mediaCapabilities.decodingInfo({...t,video:{...t.video,contentType:Ye}})]);$e={DASH_WEBM_AV1:n,DASH_WEBM:r}})().catch(e=>{console.log(Ke),console.error(e)});class et{_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 $e}get supportedCodecs(){return Object.keys(this._codecs).filter(e=>this._codecs[e])}get nativeHlsSupported(){return this._nativeHlsSupported}detect(){let e=Be();if(!Ve(e))return;let t=e.document;this._video=t.createElement(`video`);try{this._protocols={mms:Ue(),mse:We(),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=!!He()?.isTypeSupported?.(qe),n=!!He()?.isTypeSupported?.(Je),r=!!He()?.isTypeSupported?.(Ze);this._codecs={h264:t,h265:n,vp9:!!He()?.isTypeSupported?.(Ye),av1:!!He()?.isTypeSupported?.(Xe),aac:r,opus:!!He()?.isTypeSupported?.(Qe),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 tt,isBrowserWindow as nt}from"@vkontakte/videoplayer-shared/evergreen";var rt=`audio/mpeg`;class it{_audio;_containers;_codecs;supportMp3(){return this._codecs.mp3&&this._containers.mpeg}detect(){let e=tt();if(!nt(e))return;let t=e.document;this._audio=t.createElement(`audio`);try{this._containers={mpeg:!!this._audio.canPlayType?.(rt)},this._codecs={mp3:!!He()?.isTypeSupported?.(rt)}}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 at{isInited$=new De(!1);_displayChecker;_deviceChecker;_browserChecker;_videoChecker;_audioChecker;constructor(){this._displayChecker=new ze,this._deviceChecker=new Pe(this._displayChecker),this._browserChecker=new Ae,this._videoChecker=new et(this._deviceChecker,this._browserChecker),this._audioChecker=new it,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(){Ee()&&(this._displayChecker.detect(),this._deviceChecker.detect(),this._browserChecker.detect(),this._videoChecker.detect(),this._audioChecker.detect(),this.isInited$.next(!0))}}var j=new at,ot=(e,t=!1)=>{let{containers:n,protocols:r,codecs:i,nativeHlsSupported:a}=j.video,{isMobile:o}=j.device,s=j.device.isMac&&j.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 Te(e)}})},st=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 Te(e)}},ct=(e,t=!1)=>ot(Object.keys(e).filter(e=>!st(e)),t).length>0;class lt{subscription=new ae;log;params;sessionId$=new oe(null);mediaSessionId$=new oe(null);contentId$=new oe(null);progressTicker;isMobile=Ne();mobileVolumeState={muted:!1,volume:0};media=null;lastRequestedVolume=null;constructor(e){this.params=e,this.progressTicker=new we(e),this.log=this.params.dependencies.logger.createComponentLog(`ChromecastPresentationApiProvider`),this.log({message:`constructor, format: ${e.format}`}),this.params.output.isLive$.next(st(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=_e(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`:k(this.params.desiredState.playbackState,`paused`);break;case`PLAYING`:k(this.params.desiredState.playbackState,`playing`);break;case`IDLE`:t===`FINISHED`?(this.params.output.endedEvent$.next(),k(this.params.desiredState.playbackState,`stopped`),this.contentId$.next(null)):k(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 ut,ErrorCategory as dt,filter as ft,Subject as pt,Subscription as mt,tap as ht,ValueSubject as gt,fromEvent as _t,getWindow as vt}from"@vkontakte/videoplayer-shared/evergreen";var yt=e=>({castDevice:{friendlyName:e},remotePlayer:{},remotePlayerController:{},session:{}}),bt=()=>String(Date.now())+String(Math.floor(Math.random()*1e5));class xt{params;clientId;capabilities=[`WEB`];presentationRequest$=new gt(null);log;sessionId$=new gt(null);broadcastChannel=new BroadcastChannel(`vk_player_chromecast_events`);subscription=new mt;subscriptionEvents=new mt;isDestroyed=!1;sequenceNumber=0;presentationAvailable$=new gt(!1);presentationConnection$=new gt(null);message$=new gt(null);friendlyName$=new gt(null);errorEvent$=new pt;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(_t(e,`change`).subscribe(()=>{t()})),t()}).catch(()=>{this.presentationAvailable$.next(!0)}),vt().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:dt.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();ut(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:dt.WTF,id:`ChromecastPresentationApiConnector`,message:e?.message??`connect error`,thrown:e});break}}}subscribe(){this.subscription.add(_t(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(ht(e=>{this.log({message:`presentationConnection$: ${!!e}`})}),ft(e=>!!e)).subscribe(e=>{let t=_t(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=_t(e,`connect`).subscribe(()=>{this.send(`client_connect`)}),r=_t(e,`close`).subscribe(e=>{switch(e.reason){case`error`:this.errorEvent$.next({category:dt.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:dt.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 vt()[e]=vt()[e]||bt()}resetSubscriptionEvents(){this.subscriptionEvents.unsubscribe(),this.subscriptionEvents=new mt}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 St,Subject as Ct,map as wt,Subscription as Tt,combine as Et,filterChanged as Dt,assertNonNullable as Ot}from"@vkontakte/videoplayer-shared/evergreen";class kt{subscription=new Tt;log;contentId;connection$=new St(void 0);castState$=new St(`NOT_AVAILABLE`);errorEvent$=new Ct;chromecastConnector;static isSupported(){return`chrome`in window&&`presentation`in navigator&&`BroadcastChannel`in window}constructor(e){let t=kt.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 xt({appId:e.receiverApplicationId,logger:e.dependencies.logger}),this.subscribe())}subscribe(){Ot(this.chromecastConnector,`subscribe with null chromecastConnector`),this.subscription.add(this.chromecastConnector.errorEvent$.subscribe(this.errorEvent$));let e=Et({connection:this.chromecastConnector.presentationConnection$,available:this.chromecastConnector.presentationAvailable$,friendlyName:this.chromecastConnector.friendlyName$.pipe(Dt())});this.subscription.add(e.pipe(wt(({connection:e,friendlyName:t})=>!!(e&&t)),Dt()).subscribe(e=>{let t=this.chromecastConnector?.friendlyName$.getValue()??``;this.connection$.next(e?yt(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 At,Subject as jt,merge as Mt}from"@vkontakte/videoplayer-shared/evergreen";var Nt=(e,t)=>e===t;class Pt{comparator;state;prevState;transition;transitionStarted$=new jt;transitionEnded$=new jt;transitionUpdated$=new jt;forceChanged$=new jt;stateChangeStarted$=Mt(this.transitionStarted$,this.transitionUpdated$);stateChangeEnded$=Mt(this.transitionEnded$,this.forceChanged$);constructor(e,t=Nt){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)||At(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 Ft,debounce as It,ErrorCategory as Lt,fromEvent as Rt,map as zt,merge as Bt,observableFrom as Vt,Subject as Ht,Subscription as Ut,timeout as Wt}from"@vkontakte/videoplayer-shared/evergreen";var Gt=5,Kt=5,qt=500,Jt=7e3;class Yt{subscription=new Ut;loadMediaTimeoutSubscription=new Ut;videoState=new Pt(`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(st(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 Ut;this.subscription.add(e),this.subscription.add(Bt(this.videoState.stateChangeStarted$.pipe(zt(e=>`stateChangeStarted$ ${JSON.stringify(e)}`)),this.videoState.stateChangeEnded$.pipe(zt(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 Ht;e.add(t.pipe(It(qt)).subscribe(()=>{this.params.output.seekedEvent$.next()}));let n=NaN;e.add(Rt(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)>Gt)&&t.next(r),n=r})),e.add(Rt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.DURATION_CHANGED).subscribe(e=>{this.logRemoteEvent(e),this.params.output.duration$.next(e.value)}))}t(Rt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MEDIA_LOADED_CHANGED),t=>{this.logRemoteEvent(t),t.value?this.handleRemoteReady():(this.handleRemoteStop(),e.unsubscribe())}),t(Rt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED),e=>{this.logRemoteEvent(e),e.value?this.handleRemotePause():this.handleRemotePlay()}),t(Rt(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<Kt&&this.params.output.endedEvent$.next(),this.handleRemoteStop(),k(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:Ft(n)}}),t(Rt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED),e=>{this.logRemoteEvent(e),this.handleRemoteVolumeChange({volume:e.value})}),t(Rt(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED),e=>{this.logRemoteEvent(e),this.handleRemoteVolumeChange({muted:e.value})}),t(Bt(this.params.desiredState.playbackState.stateChangeStarted$,this.params.desiredState.seekState.stateChangeEnded$,this.videoState.stateChangeEnded$,Vt([`init`])).pipe(It(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`),k(this.params.desiredState.playbackState,`paused`)):(this.videoState.setState(`playing`),k(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=_e(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`),k(this.params.desiredState.playbackState,`paused`))}handleRemotePlay(){let e=this.videoState.getState();(this.videoState.getTransition()?.to===`playing`||e===`paused`)&&(this.videoState.setState(`playing`),k(this.params.desiredState.playbackState,`playing`))}handleRemoteReady(){this.videoState.getTransition()?.to===`ready`&&this.videoState.setState(`ready`),this.params.desiredState.playbackState.getTransition()?.to===`ready`&&k(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(Wt(Jt).subscribe(()=>t(`timeout(${Jt})`)))});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:Lt.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:Ft(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:Ft(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:Ft(e)}break;default:Ft(n)}}}}import{clearVideoElement as Xt,fromEvent as Zt,getWindow as Qt,Subscription as $t}from"@vkontakte/videoplayer-shared/evergreen";import{clearVideoElement as en}from"@vkontakte/videoplayer-shared/evergreen";var tn=e=>{try{e.pause(),e.playbackRate=0,en(e),e.remove()}catch(e){console.error(e)}},nn=`__spvc`;class rn{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 an=Qt(),on=an.WeakMap?new an.WeakMap:new rn,sn=an.WeakMap?new an.WeakMap:new Map,cn=(e,t=20)=>{let n=0;return Zt(e,`ratechange`).subscribe(r=>{n++,n>=t&&(e.currentTime=e.currentTime,n=0)})};function ln(e){e.style.position=`fixed`,e.style.left=`100%`,e.setAttribute(`data-role`,`screen`),Qt().document.body.appendChild(e)}function un(e,t){e.style.position=``,e.style.left=``,t.appendChild(e)}var dn=(e,{audioVideoSyncRate:t,disableYandexPiP:n,reuseOwnVideoElement:r,reuseOwnVideoElementOnBackgroundTabOnly:i})=>{let a,o=e.querySelector(`video`),s=!!o,c=Qt().document.querySelector(`body > video[data-role=screen]`)||void 0;r&&!i?an[nn]=c:(c?.remove(),delete an[nn]),o?(a=o,Xt(a)):c&&c===an[nn]?(a=c,un(a,e)):(a=Qt().document.createElement(`video`),e.appendChild(a),r&&!i&&(an[nn]=a)),on.set(a,s);let l=new $t;return l.add(cn(a,t)),sn.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},fn=e=>(e.setAttribute(`crossorigin`,`anonymous`),e.controls=!1,e),pn=(e,t)=>{if(e instanceof HTMLAudioElement){mn(e,t);return}if(e instanceof HTMLVideoElement){hn(e,t);return}};function mn(e,{clearAudioElementOnDispose:t}){if(t){Xt(e);return}tn(e)}function hn(e,{reuseOwnVideoElement:t,reuseOwnVideoElementOnBackgroundTabOnly:n}){sn.get(e)?.unsubscribe(),sn.delete(e);let r=on.get(e);on.delete(e),Xt(e),t&&!n&&!r&&ln(e)}import{isNonNullable as gn,map as _n,Subject as vn,Subscription as yn,ErrorCategory as bn}from"@vkontakte/videoplayer-shared/evergreen";import{isNonNullable as xn,isNullable as Sn,Subscription as Cn}from"@vkontakte/videoplayer-shared/evergreen";var wn=(e,t,n,{equal:r=(e,t)=>e===t,changed$:i,onError:a}={})=>{let o=e.getState(),s=t(),c=Sn(i),l=new Cn;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},Tn=(e,t,n)=>wn(t,()=>e.loop,t=>{xn(t)&&(e.loop=t)},{onError:n}),En=(e,t,n,r,i)=>wn(t,()=>({muted:e.muted,volume:e.volume}),t=>{i?.skipVideoElVolumeSync$.getValue()||xn(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}),Dn=(e,t,n,r)=>wn(t,()=>e.playbackRate,t=>{xn(t)&&(e.playbackRate=t)},{changed$:n,onError:r}),On=wn;class kn{available$=new vn;error$=new vn;subscription=new yn;externalTracks=new Map;internalTracks=new Map;emittedIds;connect(e,t){let n=e=>{this.error$.next({id:`TextTracksManager`,category:bn.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(On(e.internalTextTracks,()=>Array.from(this.internalTracks.values()),e=>{gn(e)&&this.setInternal(e)},{equal:(e,t)=>gn(e)&&gn(t)&&e.length===t.length&&e.every(({id:e},n)=>e===t[n].id),changed$:this.available$.pipe(_n(e=>e.filter(({type:e})=>e===`internal`))),onError:n})),this.subscription.add(On(e.externalTextTracks,()=>Array.from(this.externalTracks.values()),e=>{gn(e)&&this.setExternal(e)},{equal:(e,t)=>gn(e)&&gn(t)&&e.length===t.length&&e.every(({id:e},n)=>e===t[n].id),changed$:this.available$.pipe(_n(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 An=kn;class jn{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 Mn=e=>{let t=e;for(;!(t instanceof Document)&&!(t instanceof ShadowRoot)&&t!==null;)t=t?.parentNode;return t??void 0},Nn=e=>{let t=Mn(e);return!!(t&&t.fullscreenElement&&t.fullscreenElement===e)},Pn=e=>{let t=Mn(e);return!!(t&&t.pictureInPictureElement&&t.pictureInPictureElement===e)};import{fromEvent as M,map as Fn,merge as In,filterChanged as Ln,isNonNullable as Rn,Subject as zn,filter as Bn,mapTo as Vn,combine as Hn,once as Un,shareReplay as N,throttle as Wn,ErrorCategory as Gn,ErrorOrigin as Kn,ValueSubject as qn,Subscription as Jn}from"@vkontakte/videoplayer-shared/evergreen";var Yn=3,Xn=(e,t,n=Yn)=>{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}},Zn=e=>{let t=0;for(let n=0;n<e.length;n++)t+=e.end(n)-e.start(n);return t},Qn=e=>{let t=0;for(let n=0;n<e.length;n++)t+=e.end(n)-e.start(n);return t*1e3},$n=e=>{let t=t=>M(e,t).pipe(Vn(void 0),N(1)),n=new Jn,r=()=>n.unsubscribe(),i=In(M(e,`progress`),M(e,`timeupdate`)),a=i.pipe(Fn(()=>Xn(e.buffered,e.currentTime)),N(1)),o=i.pipe(Fn(()=>Qn(e.buffered)),N(1)),s=i.pipe(Fn(()=>e.buffered.length),N(1)),c=j.browser.isSafari?Hn({play:t(`play`).pipe(Un()),playing:t(`playing`)}).pipe(Vn(void 0),N(1)):t(`playing`),l=M(e,`volumechange`).pipe(Fn(()=>({muted:e.muted,volume:e.volume})),N(1)),u=M(e,`ratechange`).pipe(Fn(()=>e.playbackRate),N(1)),d=M(e,`error`).pipe(Bn(()=>!!(e.error||e.played.length)),Fn(()=>{let t=e.error;return{id:t?`MediaError#${t.code}`:`HtmlVideoError`,category:Gn.VIDEO_PIPELINE,message:t?t.message:`Error event from HTML video element`,thrown:e.error??void 0,origin:Kn.MediaError,data:t?{code:t.code}:void 0}}),N(1)),f=M(e,`timeupdate`).pipe(Fn(()=>e.currentTime),N(1)),p=In(M(e,`loadedmetadata`),M(e,`timeupdate`),M(e,`pause`),M(e,`seeked`),M(e,`ended`)).pipe(Fn(()=>Zn(e.played)),Ln(),N(1)),m=[`waiting`,`seeking`,`seeked`,`timeupdate`],h=new zn,g=.3,_;n.add(In(...m.map(t=>M(e,t))).subscribe(t=>{let n=e.currentTime;e.loop&&Rn(_)&&Rn(n)&&_>=e.duration-g&&n<=g&&h.next(_),_=n}));let v=t(`pause`).pipe(Bn(()=>!e.error&&_!==e.duration),N(1)),y=M(e,`enterpictureinpicture`).pipe(N(1)),b=M(e,`leavepictureinpicture`).pipe(N(1)),x=new qn(Pn(e));n.add(y.subscribe(()=>x.next(!0))),n.add(b.subscribe(()=>x.next(!1)));let S=new qn(Nn(e)),C=M(e,`fullscreenchange`).pipe(N(1));n.add(C.pipe(Fn(()=>Nn(e))).subscribe(S));let ee=M(e,`timeupdate`).pipe(Fn(t=>e.duration-e.currentTime<.1),Ln(),N(1)),w=In(ee.pipe(Bn(t=>!e.loop&&t)),M(e,`ended`)).pipe(Wn(1e3),Vn(void 0),N(1)),T=In(...[`waiting`,`pause`,`canplay`,`play`,`canplaythrough`,`playing`,`seeking`,`seeked`,`ended`].map(t=>M(e,t)),ee.pipe(Fn(e=>({type:e?`ended`:`unknown`})))).pipe(Fn(t=>j.browser.isFirefox&&t.type===`ended`?e.readyState<2:e.readyState<3),Ln(),N(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$:M(e,`durationchange`).pipe(Fn(()=>e.duration),N(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 er}from"@vkontakte/videoplayer-shared/evergreen";var tr=e=>{switch(e){case`mobile`:return er.Q_144P;case`lowest`:return er.Q_240P;case`low`:return er.Q_360P;case`sd`:case`medium`:return er.Q_480P;case`hd`:case`high`:return er.Q_720P;case`fullhd`:case`full`:return er.Q_1080P;case`quadhd`:case`quad`:return er.Q_1440P;case`ultrahd`:case`ultra`:return er.Q_2160P}};import{assertNotEmptyArray as nr,getWindow as rr,isInvariantQuality as ir,ValueSubject as ar}from"@vkontakte/videoplayer-shared/evergreen";var or=e=>`audioTracksAsc`in e;import{now as sr}from"@vkontakte/videoplayer-shared/evergreen";class cr{last;history={};recordSelection(e){this.history[e.id]=sr()}recordSwitch(e){this.last=e}clear(){this.last=void 0,this.history={}}}import{flattenObject as lr,isInvariantQuality as ur,isLowerOrEqual as dr,isNonNullable as fr,now as pr}from"@vkontakte/videoplayer-shared/evergreen";import{isLowerOrEqual as mr,isNonNullable as hr,isNullable as gr}from"@vkontakte/videoplayer-shared/evergreen";var _r=(e,t)=>(e??0)/(t>0?t:1),vr=e=>`quality`in e,yr=e=>(t,n)=>e*(Number(t.bitrate)-Number(n.bitrate)),br=e=>(t,n)=>e*(mr(t.quality,n.quality)?-1:1),xr=e=>(t,n)=>vr(t)&&vr(n)?br(e)(t,n):yr(e)(t,n),Sr=(e,t)=>xr(1)(e,t)<0,Cr=(e,t)=>Math.log(t)/Math.log(e),wr=(e,t,n)=>(t-n)*2**(-10*e)+n,Tr=(e,t,n,r)=>{if(gr(e))return n[0];let i=n.filter(t=>hr(t.bitrate)&&hr(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)},Er=(e,t)=>{if(gr(t)||gr(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},Dr=(e,t)=>hr(e)&&hr(t)&&t>0&&e>0&&e<=t*2,Or=({name:e,...t})=>`
|
|
7
7
|
${e}
|
|
8
8
|
${Object.entries(t).map(([e,t])=>` ${e}: ${t}`).join(`
|
|
9
9
|
`)}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vkontakte/videoplayer-core",
|
|
3
|
-
"version": "2.0.181-beta.
|
|
3
|
+
"version": "2.0.181-beta.1",
|
|
4
4
|
"author": "vk.ru",
|
|
5
5
|
"description": "Videoplayer core library based on the vk.ru platform",
|
|
6
6
|
"homepage": "https://vk.ru",
|
|
@@ -42,6 +42,6 @@
|
|
|
42
42
|
"**/*.d.ts"
|
|
43
43
|
],
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@vkontakte/videoplayer-shared": "1.0.110-beta.
|
|
45
|
+
"@vkontakte/videoplayer-shared": "1.0.110-beta.1"
|
|
46
46
|
}
|
|
47
47
|
}
|