import type { ChromecastState, IAudioStream, IConfig as ICoreInitVideoConfig, IExternalTextTrack, IOptionalTuningConfig, IPlayer, ISources, ITextTrack, IVideoStream, PlaybackRate, PlaybackState, VideoFormat } from "@vkontakte/videoplayer-core"; import type { InteractiveRange } from "@vkontakte/videoplayer-interactive"; import type { AppTracer, IError, ILogger, InterfaceLanguage, InternalsExposure, IRectangle, IValueObservable, QualityLimits, VideoQuality } from "@vkontakte/videoplayer-shared"; import type { SeekAction, ThinOneStat } from "@vkontakte/videoplayer-statistics"; import type { Readable, Writable } from "svelte/store"; import type { AdditionalButtonDeprecated, AdsPlaybackState, ControlBlocksRefs, ControlsKeys, HotKeyMapData, IAnnotationsApi, IControlInfo, IDisabledControls, IInteractiveData, IPictureInPictureApi, IPlayerControlsRef, IPlayerPhase, ITimelinePreviewThumbsData, IVideoEpisode, IVKVideoPlayerCallbacks, IVKVideoPlayerUICallbacks, PlaybackStateRealistic, Position, Size, VideoPlaybackRate, VideoPlayerView, VideoQualityForRender, VideoQualityUI, VideoSubtitle, VideoSubtitleParsed } from "../types"; import type { AdmanWrapper } from "../components/Ads/admanWrapper"; import type { Key, LanguageConfig } from "../translation/types"; import type { QualitySettingsAppliesTo } from "../utils/userSettings"; import type { GridTypes, PlayPrevChapterDisabledTooltipKey } from "../constans"; import type { AdditionalButton, AdditionalDesktopControlPanelButton } from "../components/Controls/types"; import type { AdditionalContextMenuItem, AdditionalSettingsMenuItem, ContextMenuItem, SettingsMenuItem } from "../components/Menus/subMenuTabs/types"; import type { SlotsApi } from "../utils/webAPI/slotsApi"; import type { FocusManager } from "../utils/webAPI/focusManager"; import type { ISDKConfig, IUIConfig } from "../config"; import type { IUIStatistics } from "../services/statistics"; import type { DebugData } from "./utils"; import type { ICompositionResult } from "./composition"; export interface SetQualityInfo { appliesTo?: QualitySettingsAppliesTo; changeReason?: "default" | "limit-changed"; byUser?: boolean; } export interface IAdsStateValues { position: number; duration: number; playbackState: AdsPlaybackState; canSkip: boolean; secondsToWatchBeforeSkip: number; postrollPassed: boolean; } export type IAdsState = { [K in keyof IAdsStateValues] : Writable }; export interface IUIState { t: (key: Key, params?: Record) => string; isMinimalView$: Writable; controlsVisible: Writable; /** * Точечно скрываем контролы. */ hiddenControls: Partial>>; /** * Определяет, могут ли вообще контролы быть показаны. */ isControlsAvailable: Writable; controlBlocks: { [key in keyof Required] : Writable }; touched: Writable; controls: { prevButton: Writable; playButton: Writable; replayButton: Writable; nextButton: Writable; playPrevChapterButton: Writable; seekToInteractiveButton: Writable; interactiveGraphButton: Writable; liveButton: Writable; time: Writable; episodes: Writable; volume: Writable; subtitles: Writable; settings: Writable; context: Writable; fullscreen: Writable; chromecast: Writable; pip: Writable; "theater-mode-button": Writable; vkLogo: Writable; interactiveTimeIndicator: Writable; timeline: Writable; autoplayNextToggle: Writable; disabledControls$: IDisabledControls; additionalButtons: Writable[]; }; modals: { hotKeyMap: { show: Writable; data: Writable; }; }; isFullscreen: Writable; isFullscreenOpenedByKeyboard: Writable; rotateAlpha: Writable; isAutoplay: Writable; debugPanelVisible: Writable; episodes: { panelOpened$: Writable; openedByKeyboard$: Writable; }; contextMenu: { visible$: Writable; btnRef$: Writable; openedByBtnKeyboard$: Writable; openedByHotKey$: Writable; lastActiveElem$: Writable; showContextMenuBtn$: Writable; position$: Writable; }; playerSize: Writable; isMobile: Readable; mobileNotReportControlHidden$: Readable; icon3DVideoVisible: Writable; scrubbingInProgress: Writable; volumeChangingInProgress: Writable; is3DVideo: Writable; currentGridType$: Readable; interactiveHideMobileControls: Writable; additionalButtonsDeprecated$: Readable; additionalDesktopControlPanelRightButtons$: Readable; additionalSettingsMenuItems$: Readable; additionalContextMenuItems$: Readable; overlayContainer$: Writable; startedByKeyboard$: Writable; autoplayNextEnabled$: Writable; timerNextVideoRunning$: Writable; settingsMenu: { visible$: Writable; ref$: Writable; openedByBtnKeyboard$: Writable; }; settingsSubMenu: { visible$: Writable; ref$: Writable; name$: Writable; }; /** * Отключаем любое действие пользователя. */ userActionsDisabled: Writable; /** * Положение заголовка названия видео. */ videoTitleInfo: Writable; /** * Ускорение видео х2. */ doubleForwardOn$: Writable; /** * Определяет, что двойное ускорение видео доступно. */ doubleForwardAvailable$: Readable; previewTrackActive: Writable; previewTrackDragInProgress: Writable; previewTrackAvailable: Readable; isPreviewTrackHorizontallyAligned: Readable; } export interface IWebApi { pictureInPictureApi?: IPictureInPictureApi; annotationsApi?: IAnnotationsApi; slotsApi?: SlotsApi; focusManager?: FocusManager; } export interface IPlayerState { positionExact$: Readable; positionWithScrubbing$: Readable; duration$: Readable; playbackState$: Readable; playbackStateRealistic$: Readable; isPlaying$: Readable; isLoaderVisible: Readable; bufferedProgress$: Readable; isLive$: Readable; canChangePlaybackSpeed$: Readable; isActiveLive$: Readable; isOldestAvailableLive$: Readable; isRewindableLive$: Readable; isEnded$: Readable; volume$: Readable; muted$: Readable; trafficSavingEnabled$: Readable; highQualityEnabled$: Readable; availableVideoStreams$: Readable; availableAudioStreams$: Readable; videoStream$: Readable; audioStream$: Readable; currentQuality$: Readable; autoQualityLimitingAvailable$: Readable; isAutoQualityEnabled$: Readable; availableQualities$: Readable; currentPlaybackRate$: Readable; availablePlaybackRates$: Readable; currentSubtitle$: Readable>; availableTextTracks$: Readable; availableSubtitlesList$: Readable; currentSubtitleCaptions$: Readable; previewThumbsData$: Writable; isAutoSubtitleCaptionVisible$: Writable; chromecastState$: Readable; chromecastDeviceName$: Readable; chromecastConnected$: Readable; currentFormat$: Readable; throughputEstimation$: Readable; videoBitrate$: Readable; videoEpisodes$: Writable; videoSize$: Readable; errorLog$: Readable; crashed$: Readable; isAudioAvailable$: Readable; isAudioDisabled: boolean; canDownload: boolean; availableSources$: Readable; hasMpegSources$: Readable; isInteractive: boolean; showInteractiveGraph: boolean; showSeekToInteractive: boolean; showPlayPrevChapter: boolean; showInteractiveTimeIndicator: boolean; isInteractiveTime$: Readable; interactiveEpisodes$: Readable; isInteractiveExpectation$: Writable; hasInteractiveBranches?: boolean; playPrevChapterDisabledTooltip: PlayPrevChapterDisabledTooltipKey; looped$: Writable; loadedMetadata$: Writable; /** * Определяет, можно ли в целом увидеть/выбрать Авто режим выбора качества. */ isAutoQualityAvailable$: Readable; } export interface IStoreInternalActions { preload: () => void; firstStart: (showAds: boolean) => void; play: () => void; pause: () => void; togglePlay: () => void; toggleMuted: () => void; openSettingsMenu: (wasOpenedByKey?: boolean, tick?: () => Promise) => void; closeSettingsMenu: (fromSubMenu?: boolean) => void; openSettingsSubMenu: (name: string, ref: HTMLElement) => void; closeSettingsSubMenu: (ref: HTMLElement, isClosing?: boolean) => void; setTrafficSavingEnabled: (trafficSavingEnabled: boolean, appliesTo?: QualitySettingsAppliesTo) => void; setHighQualityEnabled: (highQualityEnabled: boolean, appliesTo?: QualitySettingsAppliesTo) => void; setVolume: (volume: number) => void; setMuted: (muted: boolean) => void; startVolumeChanging: () => void; stopVolumeChanging: () => void; setAudioStream: (stream: IAudioStream) => void; setVideoStream: (stream: IVideoStream) => void; setQuality: (quality: VideoQualityUI, info?: SetQualityInfo) => void; setPlaybackRate: (playbackRate: PlaybackRate) => void; incrementPlaybackRate: () => VideoPlaybackRate; decrementPlaybackRate: () => VideoPlaybackRate; setSubtitle: (subtitle?: VideoSubtitle) => void; toggleSubtitle: () => void; togglePictureInPicture: () => void; startScrubbing: (progress: number) => void; progressScrubbing: (progress: number) => void; completeScrubbing: (progress: number, forcePrecise?: boolean, action?: ThinOneStat.ActionSeekType | SeekAction) => void; toggleChromecast: () => void; seekTime: (time: number, action: SeekAction, forcePrecise?: boolean) => void; seekEpisodeStartTime: (time: number) => void; getNextEpisode: () => IVideoEpisode | undefined; seekToNextEpisode: (episode?: IVideoEpisode) => void; getPrevEpisode: () => IVideoEpisode | undefined; seekToPrevEpisode: (episode?: IVideoEpisode) => void; seekToPercent: (percent: number, action: SeekAction) => void; switchToActiveLive: () => void; switchFromAdsToVideo: (callPlay?: boolean) => void; switchFromVideoToAds: () => void; skipAd: () => void; setLiveWaitingStart: (state: boolean) => void; setLiveWaitingRecover: (state: boolean) => void; setLiveWaitingRecord: (state: boolean) => void; clearDelayedBufferingCheckTimeout: () => void; getDebugTextData: () => string; getDebugPanelData: () => DebugData; getVideoElement: () => HTMLVideoElement | null; startLogging: () => void; stopLogging: () => void; videoRotate: (alphaDiff?: number) => void; startCameraManualRotation(mx: number, my: number): void; stopCameraManualRotation(immediate?: boolean): void; moveCameraFocusPX(xpx: number, ypx: number, dt: number): void; holdCamera(): void; releaseCamera(): void; downloadVideo: () => void; addLanguage: (config: LanguageConfig) => void; setLanguage: (language: InterfaceLanguage | string) => void; nextMovie: (movieId: number) => void; correctSeekTimeToInteractive: (time: number) => number; replayInteractive?: () => void; stopPlayer?: () => void; setLooped: (isLooped: boolean) => void; reportProblem: () => void; setAutoplayNextEnabled: (autoplayNext: boolean, byUser?: boolean) => void; setTimerNextVideoRunning: (timerNextVideoRunning: boolean) => void; prevVideoClick: (byUserAction?: boolean) => void; nextVideoClick: (byUserAction?: boolean) => void; nextVideoAnnouncementShow: () => void; nextVideoAnnouncementClick: () => void; nextVideoAnnouncementAuto: () => void; nextVideoAnnouncementCancel: () => void; checkFullscreenSupport: () => boolean; changeDoubleForwardOn: (enabled: boolean) => void; closePreviewTrack: () => void; previewTrackOpened: () => void; previewTrackDragStarted: () => void; previewTrackDragFinished: () => void; setFullscreenHandler: (cb: (() => void) | null) => void; } export interface IStoreExternalActions { firstStart: (showAds: boolean) => void; play: () => void; pause: () => void; stop: () => void; seekTime: (time: number) => void; seekEpisodeStartTime: (time: number) => void; setPlaybackRate: (playbackRate: PlaybackRate) => void; setAutoQualityLimits: (limits: QualityLimits) => void; setMuted: (muted: boolean) => void; toggleSubtitle: () => void; changeSubtitle: (enabled: boolean, id?: string) => void; setVolume: (volume: number) => void; returnFocusToEpisodes: () => void; updateAdditionalSettingsItem: (itemId: string, fields: Partial>) => void; addAdditionalSettingsItem: (newItem: AdditionalSettingsMenuItem) => void; removeAdditionalSettingsItem: (itemId: string) => void; updateAdditionalContextItem: (itemId: string, fields: Partial>) => void; addAdditionalContextItem: (newItem: AdditionalContextMenuItem) => void; removeAdditionalContextItem: (itemId: string) => void; updateAdditionalButton: (itemId: string, fields: Partial>) => void; addAdditionalButton: (newButton: AdditionalButton) => void; removeAdditionalButton: (itemId: string) => void; setLiveLowLatency: (isLowLatency: boolean) => void; hideControls: () => void; showControls: () => void; setQuality: (quality: VideoQualityUI) => void; setTrafficSavingEnabled: (trafficSavingEnabled: boolean) => void; setHighQualityEnabled: (highQualityEnabled: boolean) => void; changeAudioStream: (id: string) => void; setMinimalView: (enabled: boolean) => void; toggleFullscreen: () => void; } export interface IStoreInitVideoConfig extends ICoreInitVideoConfig { autoplay?: boolean; canDownload?: boolean; previewThumbsData?: ITimelinePreviewThumbsData; subtitles?: Omit[]; subtitlesForcedLanguage?: string; unitedVideoId?: number; videoEpisodes?: IVideoEpisode[]; } export interface IStore { initVideo: (config: IStoreInitVideoConfig) => void; videoId$: Writable; playerPhase: IPlayerPhase; interfaceLanguage$: Readable; isCyrillicRelatedInterface$: Readable; interactiveData?: IInteractiveData; vsid$: Readable; state: IPlayerState; ui: IUIState; ads: IAdsState; webApi: IWebApi; actions: { internal: IStoreInternalActions; external: IStoreExternalActions; }; callbacks?: IVKVideoPlayerCallbacks; setUiCallbacks: (uiCallbacks: IVKVideoPlayerUICallbacks) => void; initAdmanWrapper: VoidFunction; resetAdsState: VoidFunction; updateAdmanWrapperSubscriptions: VoidFunction; updateStatisticsSubscriptions: VoidFunction; updateAppTracerSubscriptions: VoidFunction; getLogger: () => ILogger; getPlayer: () => IPlayer; destroy(): void; } export type EnrichedStore = IStore & { stores: ICompositionResult["stores"]; destroyComposedStore: () => void; }; export interface IStoreParams { interfaceLanguage: InterfaceLanguage | string; isCyrillicRelatedInterface: boolean; initialVideoId?: number; isTouch: boolean; isLiveCatchUpMode?: boolean; isAudioDisabled?: boolean; canDownload?: boolean; statAuthToken?: string; callbacks?: IVKVideoPlayerCallbacks; webApi?: IWebApi; videoEpisodes?: IVideoEpisode[]; previewThumbsData?: ITimelinePreviewThumbsData; uiConfig: IUIConfig; coreConfig: IOptionalTuningConfig; metaConfig: ISDKConfig["meta"]; player?: IPlayer; isInteractive: boolean; interactiveRanges$?: IValueObservable; isInteractiveTime$?: IValueObservable; replayInteractive?: () => void; stopPlayer?: () => void; hasInteractiveBranches?: boolean; disabledControls: ControlsKeys; playPrevChapterDisabledTooltip: PlayPrevChapterDisabledTooltipKey; additionalButtons: Array; additionalSettingsMenuItems: AdditionalSettingsMenuItem[]; additionalContextMenuItems: AdditionalContextMenuItem[]; playPrevVideo: () => void; playNextVideo: () => void; /** * playPrevVideo или playNextVideo могут не вызваться, если обработка следующего видео находится на стороне интегарции, * поэтому используем данный колбэк. */ onVideoChanged: (prev: boolean) => void; looped?: boolean; getStatisticsService: () => IUIStatistics | undefined; saveRate: boolean; internalsExposure: InternalsExposure | null; playerView?: VideoPlayerView; playerId: string; getAppTracer: () => AppTracer | undefined; getAdmanWrapper: () => AdmanWrapper | undefined; logger: ILogger; }