@vkontakte/videoplayer 1.1.73-dev.ecbcbb4c.0 → 1.1.74-dev.2444f53a.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vkontakte/videoplayer",
3
- "version": "1.1.73-dev.ecbcbb4c.0",
3
+ "version": "1.1.74-dev.2444f53a.0",
4
4
  "author": "vk.com",
5
5
  "description": "Videoplayer based on the vk.com platform",
6
6
  "homepage": "https://vk.com",
@@ -55,9 +55,9 @@
55
55
  ],
56
56
  "dependencies": {
57
57
  "@adtech/rbadman": "2.2.57",
58
- "@vkontakte/videoplayer-core": "2.0.142-dev.ecbcbb4c.0",
59
- "@vkontakte/videoplayer-interactive": "1.0.48-dev.ecbcbb4c.0",
60
- "@vkontakte/videoplayer-shared": "1.0.70-dev.ecbcbb4c.0",
61
- "@vkontakte/videoplayer-statistics": "1.0.88-dev.ecbcbb4c.0"
58
+ "@vkontakte/videoplayer-core": "2.0.143-dev.2444f53a.0",
59
+ "@vkontakte/videoplayer-interactive": "1.0.49-dev.2444f53a.0",
60
+ "@vkontakte/videoplayer-shared": "1.0.71-dev.2444f53a.0",
61
+ "@vkontakte/videoplayer-statistics": "1.0.89-dev.2444f53a.0"
62
62
  }
63
63
  }
@@ -1,7 +1,7 @@
1
1
  import type { ISDKConfig } from '../config';
2
2
  import type { LanguageConfig } from '../translation/types';
3
3
  import type { IVideoData, IVKVideoPlayerConfig } from '../types';
4
- import { type QualityLimits } from '@vkontakte/videoplayer-shared';
4
+ import { type QualityLimits, type Seconds } from '@vkontakte/videoplayer-shared';
5
5
  import { InterfaceLanguage } from '@vkontakte/videoplayer-shared';
6
6
  import { type PlaybackRate } from '@vkontakte/videoplayer-core';
7
7
  import type { IStatContext } from '@vkontakte/videoplayer-statistics';
@@ -13,6 +13,10 @@ import { SlotsApi } from '../utils/webAPI/slotsApi';
13
13
  export declare class VKVideoPlayer extends HTMLElement {
14
14
  private svelteStubComponent?;
15
15
  private svelteRootComponent?;
16
+ /**
17
+ * Слой, который живет на протяжении жизни плеера, не уничтожается между переключениями видео.
18
+ */
19
+ private sveltePersistentLayerComponent?;
16
20
  private svelteErrorComponent?;
17
21
  private store?;
18
22
  private microStoresRoot?;
@@ -49,6 +53,7 @@ export declare class VKVideoPlayer extends HTMLElement {
49
53
  private readonly fatalError$;
50
54
  constructor();
51
55
  private connectedCallback;
56
+ private updatePersistentLayerProps;
52
57
  private disconnectedCallback;
53
58
  private initPlayerRootContainers;
54
59
  private needToShowNextPrevButtons;
@@ -113,6 +118,7 @@ export declare class VKVideoPlayer extends HTMLElement {
113
118
  * (если был выключен, например, ручным выбором качества пользователем)
114
119
  */
115
120
  toggleHighQuality(value: boolean): void;
121
+ changeAudioStream(id: string): void;
116
122
  addLanguage(config: LanguageConfig): void;
117
123
  setLanguage(language: InterfaceLanguage | string): Promise<void>;
118
124
  setLiveStart(videoData: IVideoData): void;
@@ -160,5 +166,6 @@ export declare class VKVideoPlayer extends HTMLElement {
160
166
  */
161
167
  handleExternalKeyboardEvent(event: KeyboardEvent): boolean;
162
168
  setAutoplayNext(autoplayNext: boolean): void;
169
+ getTotalViewTime(): Seconds | undefined;
163
170
  private unmountComponent;
164
171
  }
@@ -17,8 +17,8 @@ export type AdmanInitParams = {
17
17
  isAutoplay: boolean;
18
18
  slotId: number;
19
19
  params?: AdsParams;
20
+ paramsOverride?: AdsParams;
20
21
  duration: number;
21
- previewParam?: number;
22
22
  adsContainer: HTMLElement;
23
23
  adsVideoElement: HTMLVideoElement;
24
24
  };
@@ -16,6 +16,7 @@ export interface RootProps {
16
16
  interactiveContainer: HTMLElement | undefined;
17
17
  interactiveController: Interactives | undefined;
18
18
  subtitles: Omit<IExternalTextTrack, 'type'>[] | undefined;
19
+ subtitlesForcedLanguage?: string;
19
20
  live: IVideoLive | undefined;
20
21
  preload: boolean;
21
22
  autoplay: boolean;
@@ -26,7 +27,6 @@ export interface RootProps {
26
27
  showAds: boolean;
27
28
  adsSlotId?: number | undefined;
28
29
  adsParams?: AdsParams | undefined;
29
- adsPreviewParam?: number | undefined;
30
30
  adsAutoplayParam?: boolean;
31
31
  duration?: number | undefined;
32
32
  logoClickable: boolean;
@@ -59,6 +59,7 @@ export interface RootExports {
59
59
  setMuted: (muted: boolean) => void;
60
60
  toggleSubtitle: () => void;
61
61
  changeSubtitle: (enabled: boolean, id?: string) => void;
62
+ changeAudioStream: (id: string) => void;
62
63
  hideControls: () => void;
63
64
  showControls: () => void;
64
65
  setVolume: (volume: number) => void;
@@ -75,3 +76,6 @@ export interface RootExports {
75
76
  toggleTrafficSaving: (value: boolean) => void;
76
77
  toggleHighQuality: (value: boolean) => void;
77
78
  }
79
+ export interface PersistentLayerExports {
80
+ startVideoChangedAnimation: (prev: boolean) => void;
81
+ }
package/types/config.d.ts CHANGED
@@ -33,7 +33,9 @@ export interface IUIConfig {
33
33
  initTimeout: Milliseconds;
34
34
  runtimeTimeout: Milliseconds;
35
35
  slot?: number;
36
+ /** @deprecated, Вместо этого используйте paramsOverride: { preview } */
36
37
  preview?: number;
38
+ paramsOverride?: Record<string, unknown>;
37
39
  isMobileGoToSiteButton: boolean;
38
40
  useAdmanFromNPM: boolean;
39
41
  volumeMultiplier: number;
@@ -156,18 +158,10 @@ export interface IUIConfig {
156
158
  * Отображать ли анимацию смены статуса проигрывания.
157
159
  */
158
160
  playbackStatusShow: boolean;
159
- /**
160
- * Продолжительность анимации.
161
- */
162
- playbackStatusAnimationDuration: number;
163
161
  /**
164
162
  * Отображать ли анимацию при переключении видео на следующее или предыдущее.
165
163
  */
166
164
  playbackStatusNextVideoShow: boolean;
167
- /**
168
- * Продолжительность анимации для переключения видео.
169
- */
170
- playbackStatusNextVideoAnimationDuration: number;
171
165
  /**
172
166
  * Включает ранее выбранный язык субтитров при запуске видео
173
167
  */
@@ -190,6 +184,11 @@ export interface IUIConfig {
190
184
  * сохраняет выбранные состояния плеера в localStorage только от user actions
191
185
  */
192
186
  savePreferredStatesOnUserActionOnly: boolean;
187
+ /**
188
+ * Если включен то за зацикливание одного видео будет отвечать флаг loop
189
+ */
190
+ useLoopSetting: boolean;
191
+ doubleForwardAvailable: boolean;
193
192
  };
194
193
  interactive: {
195
194
  historyMaxLength: number;
@@ -220,6 +219,15 @@ export interface IUIConfig {
220
219
  };
221
220
  /** уникальный идентификатор пользователя для сохранения настроек */
222
221
  userSalt: string;
222
+ /**
223
+ * Время, которое нужно зажимать горячую клавишу, чтобы включилось х2 ускорение.
224
+ */
225
+ doubleForwardActivationTime: number;
226
+ playbackStatusAnimationDuration: number;
227
+ /**
228
+ * Продолжительность анимации для переключения видео.
229
+ */
230
+ playbackStatusNextVideoAnimationDuration: number;
223
231
  }
224
232
  export declare const defaultConfig: IUIConfig;
225
233
  export type IOptionalUIConfig = RecursivePartial<IUIConfig>;
package/types/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { VKVideoPlayer } from './VKVideoPlayer/index.svelte';
2
- import type { IVKVideoPlayerConfig, IControlInfo, IUpcomingLiveViewControlInfo, IVKVideoPlayerCallbacks, IVideoData, AdsParams, HotKeyMapData, HotKeyMapItem, HotKeyMapGroup, IVideoLive, IInteractiveData, AdditionalButtonDeprecated, IVideoEpisode, VideoPlayerView } from './types';
2
+ import type { IVKVideoPlayerConfig, IControlInfo, ITimelinePreviewThumbsData, IUpcomingLiveViewControlInfo, IVKVideoPlayerCallbacks, IVideoData, AdsParams, HotKeyMapData, HotKeyMapItem, HotKeyMapGroup, IVideoLive, IInteractiveData, AdditionalButtonDeprecated, IVideoEpisode, VideoPlayerView } from './types';
3
3
  import type { LanguagePack, LanguageConfig } from './translation/types';
4
4
  import type { ISDKConfig } from './config';
5
5
  import type { ISources, IDashSource, URLSource, RawSource, URLSourceWithSeek } from '@vkontakte/videoplayer-core';
@@ -8,7 +8,7 @@ export { VERSION } from './env';
8
8
  export declare const registerPlayerWebComponent: () => void;
9
9
  export { type AdditionalSettingsMenuItem, MenuItemType, type AdditionalClickSettingsMenuItem, type AdditionalSwitchSettingsMenuItem, type AdditionalContextMenuItem, } from './components/Menus/subMenuTabs/types';
10
10
  export { type AdditionalButton, ControlButtonType, } from './components/Controls/types';
11
- export type { VKVideoPlayer, IVKVideoPlayerConfig, IControlInfo, IUpcomingLiveViewControlInfo, IVKVideoPlayerCallbacks, IVideoData, AdsParams, HotKeyMapData, HotKeyMapItem, HotKeyMapGroup, ISources, IDashSource, URLSource, RawSource, URLSourceWithSeek, LanguagePack, LanguageConfig, Milliseconds, IVideoLive, IInteractiveData, AdditionalButtonDeprecated, QualityLimits, IVideoEpisode, ISDKConfig, VideoPlayerView, };
11
+ export type { VKVideoPlayer, IVKVideoPlayerConfig, IControlInfo, ITimelinePreviewThumbsData, IUpcomingLiveViewControlInfo, IVKVideoPlayerCallbacks, IVideoData, AdsParams, HotKeyMapData, HotKeyMapItem, HotKeyMapGroup, ISources, IDashSource, URLSource, RawSource, URLSourceWithSeek, LanguagePack, LanguageConfig, Milliseconds, IVideoLive, IInteractiveData, AdditionalButtonDeprecated, QualityLimits, IVideoEpisode, ISDKConfig, VideoPlayerView, };
12
12
  export { GridTypes, } from './constans';
13
13
  export { PlayerPhase, } from './types';
14
14
  export { InterfaceLanguage, VKNumericLanguage, loadVKLangPack, } from '@vkontakte/videoplayer-shared';
@@ -122,7 +122,6 @@ export interface IUIState {
122
122
  ref$: Writable<HTMLElement | undefined>;
123
123
  name$: Writable<string | undefined>;
124
124
  };
125
- aboutToGoNextVideo: Writable<'next' | 'prev' | undefined>;
126
125
  /**
127
126
  * Отключаем любое действие пользователя.
128
127
  */
@@ -131,6 +130,14 @@ export interface IUIState {
131
130
  * Положение заголовка названия видео.
132
131
  */
133
132
  videoTitleInfo: Writable<IControlInfo | undefined>;
133
+ /**
134
+ * Ускорение видео х2.
135
+ */
136
+ doubleForwardOn$: Writable<boolean>;
137
+ /**
138
+ * Определяет, что двойное ускорение видео доступно.
139
+ */
140
+ doubleForwardAvailable$: Readable<false>;
134
141
  }
135
142
  export interface IWebApi {
136
143
  pictureInPictureApi?: IPictureInPictureApi;
@@ -140,6 +147,7 @@ export interface IWebApi {
140
147
  export interface IStore {
141
148
  initVideo: (config: IConfig & {
142
149
  subtitles?: Omit<IExternalTextTrack, 'type'>[];
150
+ subtitlesForcedLanguage?: string;
143
151
  }) => void;
144
152
  videoId?: number;
145
153
  isClip: boolean;
@@ -293,6 +301,7 @@ export interface IStore {
293
301
  nextVideoAnnouncementAuto: () => void;
294
302
  nextVideoAnnouncementCancel: () => void;
295
303
  checkFullscreenSupport: () => boolean;
304
+ changeDoubleForwardOn: (enabled: boolean) => void;
296
305
  };
297
306
  external: {
298
307
  firstStart: (showAds: boolean) => void;
@@ -323,6 +332,7 @@ export interface IStore {
323
332
  setQuality: (quality: VideoQualityUI) => void;
324
333
  setTrafficSavingEnabled: (trafficSavingEnabled: boolean) => void;
325
334
  setHighQualityEnabled: (highQualityEnabled: boolean) => void;
335
+ changeAudioStream: (id: string) => void;
326
336
  };
327
337
  };
328
338
  callbacks?: IVKVideoPlayerCallbacks;
@@ -361,6 +371,11 @@ interface IStoreParams {
361
371
  additionalContextMenuItems: AdditionalContextMenuItem[];
362
372
  playPrevVideo: () => void;
363
373
  playNextVideo: () => void;
374
+ /**
375
+ * playPrevVideo или playNextVideo могут не вызваться, если обработка следующего видео находится на стороне интегарции,
376
+ * поэтому используем данный колбэк.
377
+ */
378
+ onVideoChanged: (prev: boolean) => void;
364
379
  looped?: boolean;
365
380
  statistics?: UIOneStat;
366
381
  saveRate: boolean;
@@ -372,5 +387,5 @@ interface IStoreParams {
372
387
  * Store приложения.
373
388
  * Если будет слишком большим - можно разделить его на модули
374
389
  */
375
- export declare const createStore: ({ interfaceLanguage, isCyrillicRelatedInterface, videoId, isClip, isLiveCatchUpMode, statAuthToken, isAudioDisabled, canDownload, callbacks, webApi, videoEpisodes, previewThumbsData, uiConfig, coreConfig, player: playerInstance, disabledControls, isInteractive, interactiveRanges$, isInteractiveTime$, replayInteractive, stopPlayer, hasInteractiveBranches, playPrevChapterDisabledTooltip, additionalButtons, additionalSettingsMenuItems, additionalContextMenuItems, playPrevVideo, playNextVideo, looped, statistics: uiStatistics, saveRate, internalsExposure, playerView, playerId, }: IStoreParams) => IStore;
390
+ export declare const createStore: ({ interfaceLanguage, isCyrillicRelatedInterface, videoId, isClip, isLiveCatchUpMode, statAuthToken, isAudioDisabled, canDownload, callbacks, webApi, videoEpisodes, previewThumbsData, uiConfig, coreConfig, player: playerInstance, disabledControls, isInteractive, interactiveRanges$, isInteractiveTime$, replayInteractive, stopPlayer, hasInteractiveBranches, playPrevChapterDisabledTooltip, additionalButtons, additionalSettingsMenuItems, additionalContextMenuItems, playPrevVideo, playNextVideo, onVideoChanged, looped, statistics: uiStatistics, saveRate, internalsExposure, playerView, playerId, }: IStoreParams) => IStore;
376
391
  export {};
@@ -12,7 +12,7 @@ export declare const getMicroStores: () => IMicroStores;
12
12
  */
13
13
  export declare const storeFromObservable: <T>(observable$: IValueObservable<T>, onNewValueEmitted?: (value: T) => void) => Readable<T>;
14
14
  export declare const storeFromObservableWithInitValue: <T>(observable$: IObservable<T>, initValue: T, onNewValueEmitted?: (value: T) => void) => Readable<T>;
15
- export declare const constructDebugTextData: (player: IPlayer, config: IConfig, store: IStore, traceId: string) => string;
15
+ export declare const constructDebugTextData: (player: IPlayer, config: IConfig | undefined, store: IStore, traceId: string) => string;
16
16
  export type DebugData = {
17
17
  version: string;
18
18
  viewport: string;
@@ -1,5 +1,5 @@
1
1
  import { InterfaceLanguage } from '@vkontakte/videoplayer-shared';
2
- export type Key = 'auto_quality_invariant' | 'auto_quality' | 'menu_quality' | 'menu_playback_rate' | 'menu_traffic_saving' | 'menu_report' | 'menu_pip' | 'menu_pip_close' | 'menu_copy_video_link' | 'menu_copy_video_link_with_timestamp' | 'menu_video_rotate' | 'menu_video_loop_on' | 'menu_video_loop_off' | 'menu_chromecast' | 'menu_copy_debug' | 'menu_save_debug' | 'menu_debug_overlay' | 'menu_copy_embed_code' | 'pip_dummy_title' | 'submenu_traffic_saving' | 'submenu_quality' | 'submenu_playback_rate' | 'submenu_settings' | 'submenu_audio_languages' | 'auto_quality_option' | 'playing_ads' | 'skip_ads_now' | 'skip_ads_after' | 'visit_advertiser' | 'aria_timeline' | 'aria_timeline_value' | 'doubletap_seek_step' | 'playback_rate_1' | 'playback_rate' | 'video360' | 'subtitles_caption' | 'subtitles_auto' | 'subtitles_off' | 'subtitles_auto_caption' | 'subtitles_turn_on' | 'subtitles_turn_off' | 'traffic_saving_off' | 'traffic_saving_on' | 'traffic_saving_helper_text' | 'tooltip_previous' | 'tooltip_restart' | 'tooltip_play' | 'tooltip_pause' | 'tooltip_next' | 'tooltip_button_disabled' | 'tooltip_interactive_go_back' | 'tooltip_interactive_go_back_disabled' | 'tooltip_interactive_go_back_disabled_first' | 'tooltip_interactive_go_back_disabled_limit' | 'tooltip_chapter_without_interactive' | 'tooltip_interactive_of_chapter_completed' | 'tooltip_interactive_seek' | 'tooltip_interactive_graph_off' | 'tooltip_interactive_graph_on' | 'tooltip_live' | 'tooltip_episodes' | 'tooltip_volume' | 'tooltip_volume_muted' | 'tooltip_sound_unavailable' | 'tooltip_settings_on' | 'tooltip_subtitles_off' | 'tooltip_settings_off' | 'tooltip_subtitles_on' | 'tooltip_fullscreen_off' | 'tooltip_fullscreen_on' | 'tooltip_chromecast_off' | 'tooltip_chromecast_on' | 'tooltip_episode_finished' | 'tooltip_episode_unfinished' | 'tooltip_disabled_when_interactive' | 'tooltip_disabled_when_graph_on' | 'tooltip_interactive_interaction_time_indicator' | 'tooltip_vk_logo' | 'tooltip_vk_video_logo' | 'tooltip_autoplay_off' | 'tooltip_autoplay_on' | 'tooltip_context_menu_open' | 'tooltip_context_menu_close' | 'download_video_caption' | 'hotkey_helper_current_volume' | 'hotkey_map_modal_title' | 'hotkey_map_modal_close_btn_text' | 'hotkey_map_group_title_common' | 'hotkey_map_group_title_playback' | 'hotkey_map_group_title_subtitles' | 'hotkey_map_group_title_episodes' | 'hotkey_map_item_mute_description' | 'hotkey_map_item_mute_value' | 'hotkey_map_item_volume_down_description' | 'hotkey_map_item_volume_down_value' | 'hotkey_map_item_volume_up_description' | 'hotkey_map_item_volume_up_value' | 'hotkey_map_item_pip_description' | 'hotkey_map_item_pip_value' | 'hotkey_map_item_full_screen_description' | 'hotkey_map_item_full_screen_value' | 'hotkey_map_item_show_context_menu_description' | 'hotkey_map_item_show_context_menu_value' | 'hotkey_map_item_show_hotkey_map_description' | 'hotkey_map_item_show_hotkey_map_value' | 'hotkey_map_item_play_toggle_description' | 'hotkey_map_item_play_toggle_value' | 'hotkey_map_item_seek_backward_description' | 'hotkey_map_item_seek_backward_value' | 'hotkey_map_item_seek_forward_description' | 'hotkey_map_item_seek_forward_value' | 'hotkey_map_item_fast_seek_backward_description' | 'hotkey_map_item_fast_seek_backward_value' | 'hotkey_map_item_fast_seek_forward_description' | 'hotkey_map_item_fast_seek_forward_value' | 'hotkey_map_item_rate_down_description' | 'hotkey_map_item_rate_down_value' | 'hotkey_map_item_rate_up_description' | 'hotkey_map_item_rate_up_value' | 'hotkey_map_item_prev_frame_description' | 'hotkey_map_item_prev_frame_value' | 'hotkey_map_item_next_frame_description' | 'hotkey_map_item_next_frame_value' | 'hotkey_map_item_jump_seek_description' | 'hotkey_map_item_jump_seek_value' | 'hotkey_map_item_subtitles_toggle_description' | 'hotkey_map_item_subtitles_toggle_value' | 'hotkey_map_item_prev_episode_description' | 'hotkey_map_item_prev_episode_pc_value' | 'hotkey_map_item_prev_episode_mac_value' | 'hotkey_map_item_next_episode_description' | 'hotkey_map_item_next_episode_pc_value' | 'hotkey_map_item_next_episode_mac_value' | 'hotkey_map_item_next_video_description' | 'hotkey_map_item_next_video_value' | 'hotkey_map_item_prev_video_description' | 'hotkey_map_item_prev_video_value' | 'waiting_live_day_value' | 'waiting_live_hour_value' | 'waiting_live_minute_value' | 'waiting_live_second_value' | 'waiting_live_colon' | 'waiting_live_upcoming_title' | 'waiting_live_timer_title' | 'waiting_live_recover_title' | 'waiting_record_title' | 'aria_label_submenu_traffic_saving' | 'aria_label_submenu_back' | 'aria_label_menu_quality' | 'aria_label_menu_rate' | 'aria_label_menu_subtitle' | 'aria_label_menu_download' | 'aria_label_new_tab_alert' | 'aria_label_menu_debug_overlay' | 'aria_label_menu_rotate' | 'aria_label_menu_loop' | 'aria_label_debug_panel' | 'aria_label_context_menu' | 'aria_label_video_player' | 'aria_label_spherical_control' | 'aria_label_menu_audio_languages' | 'aria_label_settings' | 'aria_label_autoplay' | 'menu_audio_languages' | 'audio_stream_display_language_label' | 'audio_stream_display_language_label_index' | 'audio_stream_display_label_index' | 'audio_stream_display_language_index' | 'audio_stream_display_unknown' | 'end_screen_next_video' | 'end_screen_recommended_video' | 'other_quality' | 'high_quality' | 'high_quality_description' | 'auto_quality_limit' | 'traffic_saving_quality' | 'traffic_saving_quality_description' | 'quality_applience' | 'quality_applience_action' | 'default_quality_for_any_video' | 'slow_video_notification_button' | 'slow_video_notification_force_description' | 'slow_video_notification_suggest_description';
2
+ export type Key = 'auto_quality_invariant' | 'auto_quality' | 'menu_quality' | 'menu_playback_rate' | 'menu_traffic_saving' | 'menu_report' | 'menu_pip' | 'menu_pip_close' | 'menu_copy_video_link' | 'menu_copy_video_link_with_timestamp' | 'menu_video_rotate' | 'menu_video_loop_on' | 'menu_video_loop_off' | 'menu_chromecast' | 'menu_copy_debug' | 'menu_save_debug' | 'menu_debug_overlay' | 'menu_copy_embed_code' | 'pip_dummy_title' | 'submenu_traffic_saving' | 'submenu_quality' | 'submenu_playback_rate' | 'submenu_settings' | 'submenu_audio_languages' | 'auto_quality_option' | 'playing_ads' | 'skip_ads_now' | 'skip_ads_after' | 'visit_advertiser' | 'aria_timeline' | 'aria_timeline_value' | 'doubletap_seek_step' | 'playback_rate_1' | 'playback_rate' | 'video360' | 'subtitles_caption' | 'subtitles_auto' | 'subtitles_off' | 'subtitles_auto_caption' | 'subtitles_turn_on' | 'subtitles_turn_off' | 'traffic_saving_off' | 'traffic_saving_on' | 'traffic_saving_helper_text' | 'tooltip_previous' | 'tooltip_restart' | 'tooltip_play' | 'tooltip_pause' | 'tooltip_next' | 'tooltip_button_disabled' | 'tooltip_interactive_go_back' | 'tooltip_interactive_go_back_disabled' | 'tooltip_interactive_go_back_disabled_first' | 'tooltip_interactive_go_back_disabled_limit' | 'tooltip_chapter_without_interactive' | 'tooltip_interactive_of_chapter_completed' | 'tooltip_interactive_seek' | 'tooltip_interactive_graph_off' | 'tooltip_interactive_graph_on' | 'tooltip_live' | 'tooltip_episodes' | 'tooltip_volume' | 'tooltip_volume_muted' | 'tooltip_sound_unavailable' | 'tooltip_settings_on' | 'tooltip_subtitles_off' | 'tooltip_settings_off' | 'tooltip_subtitles_on' | 'tooltip_fullscreen_off' | 'tooltip_fullscreen_on' | 'tooltip_chromecast_off' | 'tooltip_chromecast_on' | 'tooltip_episode_finished' | 'tooltip_episode_unfinished' | 'tooltip_disabled_when_interactive' | 'tooltip_disabled_when_graph_on' | 'tooltip_interactive_interaction_time_indicator' | 'tooltip_vk_logo' | 'tooltip_vk_video_logo' | 'tooltip_autoplay_off' | 'tooltip_autoplay_on' | 'tooltip_context_menu_open' | 'tooltip_context_menu_close' | 'download_video_caption' | 'hotkey_helper_current_volume' | 'hotkey_map_modal_title' | 'hotkey_map_modal_close_btn_text' | 'hotkey_map_group_title_common' | 'hotkey_map_group_title_playback' | 'hotkey_map_group_title_subtitles' | 'hotkey_map_group_title_episodes' | 'hotkey_map_item_mute_description' | 'hotkey_map_item_mute_value' | 'hotkey_map_item_volume_down_description' | 'hotkey_map_item_volume_down_value' | 'hotkey_map_item_volume_up_description' | 'hotkey_map_item_volume_up_value' | 'hotkey_map_item_pip_description' | 'hotkey_map_item_pip_value' | 'hotkey_map_item_full_screen_description' | 'hotkey_map_item_full_screen_value' | 'hotkey_map_item_show_context_menu_description' | 'hotkey_map_item_show_context_menu_value' | 'hotkey_map_item_show_hotkey_map_description' | 'hotkey_map_item_show_hotkey_map_value' | 'hotkey_map_item_play_toggle_description' | 'hotkey_map_item_play_toggle_value' | 'hotkey_map_item_seek_backward_description' | 'hotkey_map_item_seek_backward_value' | 'hotkey_map_item_seek_forward_description' | 'hotkey_map_item_seek_forward_value' | 'hotkey_map_item_fast_seek_backward_description' | 'hotkey_map_item_fast_seek_backward_value' | 'hotkey_map_item_fast_seek_forward_description' | 'hotkey_map_item_fast_seek_forward_value' | 'hotkey_map_item_rate_down_description' | 'hotkey_map_item_rate_down_value' | 'hotkey_map_item_rate_up_description' | 'hotkey_map_item_rate_up_value' | 'hotkey_map_item_prev_frame_description' | 'hotkey_map_item_prev_frame_value' | 'hotkey_map_item_next_frame_description' | 'hotkey_map_item_next_frame_value' | 'hotkey_map_item_jump_seek_description' | 'hotkey_map_item_jump_seek_value' | 'hotkey_map_item_subtitles_toggle_description' | 'hotkey_map_item_subtitles_toggle_value' | 'hotkey_map_item_prev_episode_description' | 'hotkey_map_item_prev_episode_pc_value' | 'hotkey_map_item_prev_episode_mac_value' | 'hotkey_map_item_next_episode_description' | 'hotkey_map_item_next_episode_pc_value' | 'hotkey_map_item_next_episode_mac_value' | 'hotkey_map_item_next_video_description' | 'hotkey_map_item_next_video_value' | 'hotkey_map_item_prev_video_description' | 'hotkey_map_item_prev_video_value' | 'waiting_live_day_value' | 'waiting_live_hour_value' | 'waiting_live_minute_value' | 'waiting_live_second_value' | 'waiting_live_colon' | 'waiting_live_upcoming_title' | 'waiting_live_timer_title' | 'waiting_live_recover_title' | 'waiting_record_title' | 'aria_label_submenu_traffic_saving' | 'aria_label_submenu_back' | 'aria_label_menu_quality' | 'aria_label_menu_rate' | 'aria_label_menu_subtitle' | 'aria_label_menu_download' | 'aria_label_new_tab_alert' | 'aria_label_menu_debug_overlay' | 'aria_label_menu_rotate' | 'aria_label_menu_loop' | 'aria_label_debug_panel' | 'aria_label_context_menu' | 'aria_label_video_player' | 'aria_label_spherical_control' | 'aria_label_menu_audio_languages' | 'aria_label_settings' | 'aria_label_autoplay' | 'menu_audio_languages' | 'audio_stream_display_language_label' | 'audio_stream_display_language_label_index' | 'audio_stream_display_label_index' | 'audio_stream_display_language_index' | 'audio_stream_display_unknown' | 'end_screen_next_video' | 'end_screen_recommended_video' | 'other_quality' | 'high_quality' | 'high_quality_description' | 'auto_quality_limit' | 'traffic_saving_quality' | 'traffic_saving_quality_description' | 'quality_applience' | 'quality_applience_action' | 'default_quality_for_any_video' | 'slow_video_notification_button' | 'slow_video_notification_force_description' | 'slow_video_notification_suggest_description' | 'double_forward_label';
3
3
  export type LanguagePack = Record<Key, string>;
4
4
  export type LanguageConfig = {
5
5
  language: string;
@@ -1,4 +1,4 @@
1
- import type { VideoQuality, VideoFormat, ISources, IExternalTextTrack } from '@vkontakte/videoplayer-core';
1
+ import type { VideoQuality, VideoFormat, ISources, IExternalTextTrack, IAudioStream } from '@vkontakte/videoplayer-core';
2
2
  import type { IValueObservable, InterfaceLanguage, Subscription, IRectangle, DevNullEntry } from '@vkontakte/videoplayer-shared';
3
3
  import type { Chapter, Manifest, ManifestVideo, VideoInfo, Interactives, IInteractiveOptions } from '@vkontakte/videoplayer-interactive';
4
4
  import { PlaybackState } from '@vkontakte/videoplayer-core';
@@ -36,6 +36,8 @@ export interface IVKVideoPlayerCallbacks {
36
36
  onSubtitleOff?: () => void;
37
37
  onSubtitleOn?: (lang: string, id: string) => void;
38
38
  onAvailableSubtitlesChanged?: (subtitles: AvailableVideoSubtitle[]) => void;
39
+ onAvailableAudioStreamsChanged?: (audioStreams: AvailableAudioStream[]) => void;
40
+ onAudioStreamChanged?: (id: string) => void;
39
41
  onAudioDisabledHint?: () => void;
40
42
  onAudioDoesNotExistHint?: () => void;
41
43
  onEpisodeClicked?: (byKeyboard: boolean) => void;
@@ -188,7 +190,7 @@ export interface ITimelinePreviewThumbsData {
188
190
  isUV: boolean;
189
191
  links: string[];
190
192
  }
191
- export type VideoLiveStatus = 'started' | 'upcoming' | 'waiting' | 'finished' | 'postlive' | 'failed';
193
+ export type VideoLiveStatus = 'no_video' | 'deleted' | 'waiting' | 'started' | 'finished' | 'upcoming' | 'failed' | 'postlive';
192
194
  export interface IVideoLive {
193
195
  status: VideoLiveStatus;
194
196
  startTime?: number;
@@ -206,6 +208,7 @@ export interface IVideoDataBase {
206
208
  previewThumbsData?: ITimelinePreviewThumbsData;
207
209
  isClip?: boolean;
208
210
  subtitles?: Array<Omit<IExternalTextTrack, 'type'>>;
211
+ subtitlesForcedLanguage?: string;
209
212
  sources?: ISources;
210
213
  live?: IVideoLive;
211
214
  }
@@ -257,6 +260,7 @@ export interface IVKVideoPlayerConfig {
257
260
  preload?: boolean;
258
261
  autoplay?: boolean;
259
262
  repeat?: boolean;
263
+ loop?: boolean;
260
264
  volume?: number;
261
265
  muted?: boolean;
262
266
  fromTime?: number;
@@ -265,6 +269,7 @@ export interface IVKVideoPlayerConfig {
265
269
  showAds?: boolean;
266
270
  adsSlotId?: number;
267
271
  adsParams?: AdsParams;
272
+ /** @deprecated */
268
273
  adsPreviewParam?: number;
269
274
  adsAutoplayParam?: boolean;
270
275
  interfaceLanguage?: InterfaceLanguage | string;
@@ -485,6 +490,7 @@ export type AvailableVideoSubtitle = {
485
490
  language: string;
486
491
  title: string;
487
492
  };
493
+ export type AvailableAudioStream = Required<Pick<IAudioStream, 'id' | 'language' | 'label'>>;
488
494
  export type VideoSubtitle = {
489
495
  value: string;
490
496
  displayValue: string;
@@ -14,14 +14,9 @@ interface DocumentElementWithFullscreen extends HTMLElement {
14
14
  mozRequestFullScreen?: () => Promise<void>;
15
15
  webkitRequestFullscreen?: () => Promise<void>;
16
16
  }
17
- interface IosSafariVideoElementWithFullscreen extends HTMLVideoElement {
18
- webkitSupportsFullscreen?: boolean;
19
- webkitEnterFullscreen?: () => void;
20
- webkitExitFullscreen?: () => void;
21
- }
22
17
  export declare const requestFullscreen: (element: DocumentElementWithFullscreen) => Promise<void>;
23
18
  export declare const exitFullscreen: (doc: DocumentWithFullscreen) => Promise<void>;
24
- export declare const isSupported: (doc: DocumentWithFullscreen, videoElement: IosSafariVideoElementWithFullscreen | null) => boolean;
19
+ export declare const isSupported: (doc: DocumentWithFullscreen, isIOS?: boolean) => boolean;
25
20
  export declare const exitIosSafariVideoElementFullscreen: (videoElement: HTMLVideoElement) => void;
26
21
  export declare const getDocumentFullscreenElement: () => Element | undefined;
27
22
  export declare const checkIsFullscreen: () => boolean;