@ngxsplayer/ngx-smart-player 0.0.1-next.0 → 0.1.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/index.d.ts CHANGED
@@ -1,9 +1,166 @@
1
- import { PlayerConfig, PlayerPlugin, PlayerPorts, EngineFactory, PlayerState, MediaTrack, SubtitleProvider, MetadataProvider } from '@ngxsp/core';
1
+ import { PlayerConfig, PlayerPlugin, PlayerPorts, EngineFactory, PlayerState, MediaTrack, PlayerError, MetadataProvider, SubtitleProvider } from '@ngxsp/core';
2
2
  export * from '@ngxsp/core';
3
- import * as i0 from '@angular/core';
4
- import { OnInit, OnDestroy, EventEmitter, ElementRef, EnvironmentProviders } from '@angular/core';
3
+ import * as _angular_core from '@angular/core';
4
+ import { EventEmitter, AfterViewInit, OnChanges, OnInit, OnDestroy, ElementRef, SimpleChanges, InjectionToken, EnvironmentProviders } from '@angular/core';
5
+ import { NgxspTimelineMarker, SourceProfile } from '@ngxsplayer/ngx-smart-player-ui-core';
5
6
 
6
- declare class SmartPlayerComponent implements OnInit, OnDestroy {
7
+ type SmartPlayerIconName = 'play' | 'pause' | 'prev' | 'next' | 'seek-back' | 'seek-forward' | 'volume-mute' | 'volume-low' | 'volume-high' | 'shuffle' | 'repeat' | 'repeat-one' | 'tracks' | 'captions' | 'captions-off' | 'speed' | 'pip' | 'pip-active' | 'airplay' | 'airplay-active' | 'cast' | 'cast-active' | 'devices' | 'devices-active' | 'radio' | 'server' | 'window-mini' | 'window-bar' | 'window-restore' | 'cinema' | 'cinema-active' | 'lyrics' | 'info' | 'bell' | 'thumb-up' | 'thumb-down' | 'share' | 'playlist-plus' | 'clock' | 'home' | 'layers' | 'video' | 'music' | 'broadcast' | 'heart' | 'download' | 'trash' | 'folder' | 'settings' | 'search' | 'grid' | 'list' | 'more' | 'waveform' | 'sliders' | 'network' | 'cloud' | 'spark' | 'disc' | 'user' | 'tag' | 'close' | 'plus' | 'check' | 'menu' | 'panel-right' | 'chevron-left' | 'chevron-right' | 'chevron-up' | 'chevron-down' | 'fullscreen' | 'fullscreen-exit';
8
+ declare class SmartPlayerIconComponent {
9
+ name: SmartPlayerIconName;
10
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SmartPlayerIconComponent, never>;
11
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SmartPlayerIconComponent, "ngxsp-smart-icon", never, { "name": { "alias": "name"; "required": true; }; }, {}, never, never, true, never>;
12
+ }
13
+
14
+ interface SmartSettingOption {
15
+ id: string;
16
+ label: string;
17
+ }
18
+ /** A line of a list setting, such as a library folder. */
19
+ interface SmartSettingEntry {
20
+ id: string;
21
+ label: string;
22
+ detail?: string;
23
+ /** An entry the listener always keeps, such as a folder the app owns: it is shown without its remove button. */
24
+ fixed?: boolean;
25
+ }
26
+ interface SmartSettingBase {
27
+ id: string;
28
+ label: string;
29
+ description?: string;
30
+ }
31
+ /**
32
+ * One setting. The host owns every value and hears what the listener asks for through the component's outputs:
33
+ * - `switch`: on or off;
34
+ * - `choice`: one of a few options, shown side by side;
35
+ * - `list`: entries the listener can remove one by one, with an optional action for the whole list;
36
+ * - `action`: a button that does something now (scan again, clear a cache);
37
+ * - `secret`: something typed that must not be read over a shoulder, sent when it is submitted
38
+ * and never held afterwards — the field empties itself, and the host is the only one that
39
+ * ever sees what was typed.
40
+ */
41
+ type SmartSettingItem = (SmartSettingBase & {
42
+ kind: 'switch';
43
+ value: boolean;
44
+ disabled?: boolean;
45
+ }) | (SmartSettingBase & {
46
+ kind: 'choice';
47
+ value: string;
48
+ options: SmartSettingOption[];
49
+ }) | (SmartSettingBase & {
50
+ kind: 'list';
51
+ entries: SmartSettingEntry[];
52
+ removeLabel: string;
53
+ emptyLabel?: string;
54
+ actionLabel?: string;
55
+ busy?: boolean;
56
+ }) | (SmartSettingBase & {
57
+ kind: 'action';
58
+ actionLabel: string;
59
+ busy?: boolean;
60
+ disabled?: boolean;
61
+ }) | (SmartSettingBase & {
62
+ kind: 'secret';
63
+ actionLabel: string;
64
+ placeholder?: string;
65
+ /** A second field, when what is typed has to be given twice — an old code and a new one. */
66
+ secondPlaceholder?: string;
67
+ /** Digits only, which is what a device's own lock screen asks for. */
68
+ digits?: boolean;
69
+ busy?: boolean;
70
+ disabled?: boolean;
71
+ });
72
+ interface SmartSettingsSection {
73
+ id: string;
74
+ title: string;
75
+ items: SmartSettingItem[];
76
+ }
77
+ interface SmartSettingChange {
78
+ id: string;
79
+ value: boolean | string;
80
+ /** A `secret` setting's second field, when it has one: the old code beside the new one. */
81
+ previous?: string;
82
+ }
83
+ /** An action: a list's own action (no entry), the removal of one of its entries, or an action setting. */
84
+ interface SmartSettingAction {
85
+ id: string;
86
+ entryId?: string;
87
+ }
88
+ /**
89
+ * The settings of a player, grouped in sections. Colours come from the host through CSS variables
90
+ * (`--ngxsp-settings-surface`, `-text`, `-muted`, `-line`, `-control`, `-accent`, `-accent-text`, `-radius`).
91
+ */
92
+ declare class SmartSettingsComponent {
93
+ sections: SmartSettingsSection[];
94
+ settingChange: EventEmitter<SmartSettingChange>;
95
+ settingAction: EventEmitter<SmartSettingAction>;
96
+ /**
97
+ * Sends what was typed and empties the fields at once. Nothing secret stays in the component:
98
+ * the host is the only place it goes, and it does not come back through an input.
99
+ */
100
+ protected submitSecret(event: Event, id: string): void;
101
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SmartSettingsComponent, never>;
102
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SmartSettingsComponent, "ngxsp-settings", never, { "sections": { "alias": "sections"; "required": false; }; }, { "settingChange": "settingChange"; "settingAction": "settingAction"; }, never, never, true, never>;
103
+ }
104
+
105
+ /**
106
+ * A question the user answers before anything happens (another device asking to send its playback here). The
107
+ * cautious answer has the focus and Escape; the dialog stays until one of the two buttons is pressed. Colours come
108
+ * from the host through CSS variables (`--ngxsp-dialog-surface`, `-text`, `-muted`, `-line`, `-accent`,
109
+ * `-accent-text`, `-radius`).
110
+ */
111
+ declare class SmartConfirmDialogComponent implements AfterViewInit {
112
+ title: string;
113
+ message: string;
114
+ confirmLabel: string;
115
+ cancelLabel: string;
116
+ confirmed: EventEmitter<void>;
117
+ cancelled: EventEmitter<void>;
118
+ private cancelButton?;
119
+ protected readonly id: string;
120
+ ngAfterViewInit(): void;
121
+ protected onEscape(event: Event): void;
122
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SmartConfirmDialogComponent, never>;
123
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SmartConfirmDialogComponent, "ngxsp-confirm-dialog", never, { "title": { "alias": "title"; "required": false; }; "message": { "alias": "message"; "required": false; }; "confirmLabel": { "alias": "confirmLabel"; "required": false; }; "cancelLabel": { "alias": "cancelLabel"; "required": false; }; }, { "confirmed": "confirmed"; "cancelled": "cancelled"; }, never, never, true, never>;
124
+ }
125
+
126
+ /**
127
+ * How much of a desktop player window shows: all of it, a small floating player (`mini`), or a strip along the
128
+ * bottom of the screen (`bar`, audio only: a video needs a picture). The host resizes the window; the UIs lay the
129
+ * player out to match.
130
+ */
131
+ type SmartCompactMode = 'full' | 'mini' | 'bar';
132
+
133
+ /** The words of the player's menus; English by default. */
134
+ interface PlayerMenuLabels {
135
+ captions: string;
136
+ off: string;
137
+ audio: string;
138
+ singleAudio: string;
139
+ quality: string;
140
+ auto: string;
141
+ singleQuality: string;
142
+ speed: string;
143
+ /** Title of the subtitles menu, and of its button. */
144
+ subtitles: string;
145
+ /** Before the name of the subtitles shown now. */
146
+ current: string;
147
+ noSubtitles: string;
148
+ loadSubtitles: string;
149
+ tracks: string;
150
+ media: string;
151
+ /** Locale for the names of languages ("fr" becomes "French"); the device's by default. */
152
+ locale?: string;
153
+ }
154
+ declare const DEFAULT_PLAYER_MENU_LABELS: PlayerMenuLabels;
155
+
156
+ /** A playback position and the media it was measured on. */
157
+ interface SmartPlayerProgress {
158
+ currentTime: number;
159
+ duration: number;
160
+ contentId?: string;
161
+ sourceUrl?: string;
162
+ }
163
+ declare class SmartPlayerComponent implements OnChanges, OnInit, OnDestroy {
7
164
  config: PlayerConfig;
8
165
  plugins: PlayerPlugin[];
9
166
  ports?: Partial<PlayerPorts>;
@@ -11,29 +168,77 @@ declare class SmartPlayerComponent implements OnInit, OnDestroy {
11
168
  debug: boolean;
12
169
  /** Optional start time (seconds) used for "resume playback". */
13
170
  startTimeSec: number | null;
171
+ /** Starts the first source as soon as it is loaded. WebViews and desktop shells do not block it like browsers do. */
172
+ autoplayOnInit: boolean;
173
+ /** Increment when the user picks something to play: a new source starts, the current one resumes. */
174
+ playRequest: number;
14
175
  canPrev: boolean;
15
176
  canNext: boolean;
177
+ previousLabel: string;
178
+ nextLabel: string;
179
+ playLabel: string;
180
+ pauseLabel: string;
16
181
  shuffleActive: boolean;
17
182
  shuffleLabel: string;
18
183
  repeatMode: 'off' | 'one' | 'all';
19
184
  repeatLabel: string;
20
185
  hasPlaylistControls: boolean;
186
+ mediaMode: 'video' | 'audio';
187
+ castEnabled: boolean;
188
+ /** The media plays on a device the app drives (castEnabled): the devices button shows it. */
189
+ castConnected: boolean;
190
+ private airPlayAvailable;
191
+ private airPlayActive;
192
+ documentShortcuts: boolean;
193
+ nowPlayingLabel: string;
194
+ nowListeningLabel: string;
195
+ fullscreenHintLabel: string;
196
+ fullscreenLabel: string;
197
+ readyStatusLabel: string;
198
+ playingStatusLabel: string;
199
+ pausedStatusLabel: string;
200
+ bufferingStatusLabel: string;
201
+ loadingStatusLabel: string;
202
+ endedStatusLabel: string;
203
+ errorStatusLabel: string;
204
+ outputVolume: number | null;
205
+ outputVolumeLabel: string;
206
+ outputMuteLabel: string;
207
+ outputUnmuteLabel: string;
208
+ timelineDurationSec: number | null;
209
+ timelineMarkers: ReadonlyArray<NgxspTimelineMarker>;
21
210
  ended: EventEmitter<void>;
22
211
  videoSize: EventEmitter<{
23
212
  width: number;
24
213
  height: number;
25
214
  }>;
26
- /** Emits playback position updates. */
27
- progress: EventEmitter<{
28
- currentTime: number;
29
- duration: number;
30
- }>;
215
+ /**
216
+ * Emits playback position updates, tagged with the media they belong to: a host switching tracks can still receive
217
+ * a position of the previous one, and must not file it under the new one.
218
+ */
219
+ progress: EventEmitter<SmartPlayerProgress>;
31
220
  prev: EventEmitter<void>;
32
221
  next: EventEmitter<void>;
33
222
  toggleShuffle: EventEmitter<void>;
34
223
  cycleRepeat: EventEmitter<void>;
224
+ /** CC pressed; the vod and edition skins also open their subtitles menu. */
35
225
  subtitles: EventEmitter<void>;
226
+ /** A subtitle file was read (ok) or could not be (error). */
227
+ subtitlesLoaded: EventEmitter<{
228
+ label: string;
229
+ ok: boolean;
230
+ error?: string;
231
+ }>;
232
+ /** The words of the player's menus and of its subtitles button. */
233
+ menuLabels: Partial<PlayerMenuLabels>;
234
+ cast: EventEmitter<void>;
235
+ stateChange: EventEmitter<PlayerState>;
236
+ playbackToggle: EventEmitter<"play" | "pause">;
237
+ outputVolumeChange: EventEmitter<number>;
36
238
  videoEl: ElementRef<HTMLVideoElement>;
239
+ captionsLayer: ElementRef<HTMLElement>;
240
+ /** Absent in audio mode, which has no subtitles. */
241
+ subtitleFileInput?: ElementRef<HTMLInputElement>;
37
242
  state: PlayerState | null;
38
243
  duration: number;
39
244
  currentTime: number;
@@ -42,30 +247,55 @@ declare class SmartPlayerComponent implements OnInit, OnDestroy {
42
247
  playbackRate: number;
43
248
  bufferAheadSec: number;
44
249
  tracks: MediaTrack[];
45
- openMenu: 'tracks' | 'speed' | null;
250
+ openMenu: 'tracks' | 'speed' | 'captions' | null;
46
251
  controlsVisible: boolean;
252
+ surfaceGesture: 'play' | 'pause' | null;
253
+ castState: 'disconnected' | 'connecting' | 'connected';
47
254
  readonly playbackRates: number[];
48
255
  private facade;
256
+ private readonly cdr;
49
257
  private sub;
50
258
  private hideControlsTimer;
51
- get uiSkin(): 'classic' | 'netflix';
259
+ private surfaceClickTimer;
260
+ private gestureTimer;
261
+ private remotePlaybackCleanup;
262
+ private initialized;
263
+ private loadedSourceSignature;
264
+ private loadSequence;
265
+ private loading;
266
+ private pendingPlay;
267
+ /** Whether the load in progress was asked to start playback. */
268
+ private loadingAutoplay;
269
+ /** Load whose end was already reported; reset when playback starts again (repeat one). */
270
+ private endedLoadSequence;
271
+ private pendingSeekSec;
272
+ get uiSkin(): 'classic' | 'vod' | 'edition';
273
+ /** Libellé méta du skin édition (genre · format). */
274
+ get editionMeta(): string;
52
275
  get uiVisible(): boolean;
53
276
  get displayTitle(): string;
277
+ get displaySubtitle(): string;
278
+ get isAudioMode(): boolean;
279
+ /** Profil de source transmis aux primitives UI (cf. @ngxsp/ui-core). */
280
+ get sourceProfile(): SourceProfile;
54
281
  get audioTracks(): MediaTrack[];
55
282
  get textTracks(): MediaTrack[];
56
283
  get videoTracks(): MediaTrack[];
57
284
  get selectedAudioTrackId(): string | null;
58
285
  get selectedTextTrackId(): string | null;
59
286
  get selectedVideoTrackId(): string | null;
287
+ ngOnChanges(changes: SimpleChanges): void;
60
288
  ngOnInit(): void;
61
289
  ngOnDestroy(): void;
62
290
  tryPlay(): void;
63
291
  get debugJson(): string;
64
- get autoplayBlocked(): boolean;
292
+ get currentError(): PlayerError | null;
65
293
  copyDebug(): Promise<void>;
66
294
  downloadDebug(): void;
67
295
  togglePlay(): void;
296
+ requestPlaybackToggle(): void;
68
297
  seekRel(deltaSec: number): void;
298
+ seekTo(timeSec: number): void;
69
299
  onScrub(value: number): void;
70
300
  onVolume(value: number): void;
71
301
  toggleMute(): void;
@@ -74,7 +304,18 @@ declare class SmartPlayerComponent implements OnInit, OnDestroy {
74
304
  onLoadedMetadata(): void;
75
305
  onEnded(): void;
76
306
  toggleFullscreen(): void;
77
- toggleMenu(menu: 'tracks' | 'speed'): void;
307
+ toggleMenu(menu: 'tracks' | 'speed' | 'captions'): void;
308
+ get playerMenuLabels(): PlayerMenuLabels;
309
+ onCaptionsClick(): void;
310
+ openSubtitlePicker(): void;
311
+ onSubtitleFileChosen(event: Event): Promise<void>;
312
+ /** Reads a SubRip or WebVTT file and shows it over the video. */
313
+ loadSubtitleFile(file: File): Promise<void>;
314
+ private controlsObserver?;
315
+ /** While the controls show, the subtitles sit just above them, however tall they are (a menu makes them taller). */
316
+ private followControlsHeight;
317
+ /** Draws the cues of the loaded subtitles (their markup parsed by the browser: italics, bold, no script). */
318
+ private drawCaptions;
78
319
  selectTextTrack(trackId: string | null): Promise<void>;
79
320
  selectAudioTrack(trackId: string): Promise<void>;
80
321
  selectVideoTrack(trackId: string | null): Promise<void>;
@@ -82,45 +323,266 @@ declare class SmartPlayerComponent implements OnInit, OnDestroy {
82
323
  isPiPSupported(): boolean;
83
324
  pipLabel(): string;
84
325
  isPiPActive(): boolean;
326
+ requestCast(): Promise<void>;
327
+ isCastSupported(): boolean;
328
+ isCastActive(): boolean;
329
+ showCastButton(): boolean;
330
+ /**
331
+ * AirPlay, as WebKit offers it: the system decides what is reachable and draws the picker
332
+ * itself. Nothing is discovered here, and nothing is sent — the route belongs to the device.
333
+ * Everywhere else these stay false and the button never appears.
334
+ */
335
+ showAirPlayButton(): boolean;
336
+ isAirPlayActive(): boolean;
337
+ airPlayLabel(): string;
338
+ openAirPlayPicker(): void;
339
+ /** Wired to the media element whenever one is created, for video and for audio alike. */
340
+ private watchAirPlay;
341
+ castLabel(): string;
342
+ castHintLabel(): string;
343
+ onCastClick(): void;
85
344
  captionsLabel(): string;
86
345
  volumeLabel(): string;
87
- volumeIcon(): string;
88
346
  playbackRateLabel(): string;
89
347
  statusLabel(): string;
90
348
  keyboardHintLabel(): string;
91
349
  tracksButtonLabel(): string;
92
- trackLabel(track: MediaTrack): string;
93
- qualityLabel(track: MediaTrack): string;
350
+ onPrimarySurfaceDoubleClick(): void;
94
351
  bufferPercent(): number;
95
352
  fmtTime(sec: number): string;
96
353
  noop(): void;
354
+ /**
355
+ * Music plays in a real <audio> element: mobile browsers and Android WebViews pause <video> elements as soon as
356
+ * the page is hidden, which would stop the music when the app goes to the background or the screen turns off.
357
+ */
358
+ private mediaElementForMode;
97
359
  onInteraction(persist?: boolean): void;
98
360
  onPointerLeave(): void;
99
361
  onRootClick(event: MouseEvent): void;
100
362
  onEscape(): void;
101
363
  onKeydown(event: KeyboardEvent): void;
364
+ private loadConfig;
365
+ private applyStartTime;
366
+ private applySeek;
367
+ private safeSeekTime;
368
+ private sourceSignature;
369
+ private bindRemotePlaybackState;
102
370
  private syncControlVisibility;
371
+ private applyVolume;
372
+ private syncOutputVolumeInput;
373
+ setOutputVolume(value: number): void;
374
+ private setVolume;
375
+ private normalizeVolume;
103
376
  private clearHideControlsTimer;
377
+ private queueSurfacePlaybackToggle;
378
+ private clearSurfaceClickTimer;
379
+ private playbackToggleIntent;
380
+ private showSurfaceGesture;
381
+ private clearGestureTimer;
104
382
  private isInteractiveTarget;
105
- errorTitle(): string;
106
- errorHint(): string;
107
- onRetry(): Promise<void>;
108
- onUserPlay(): Promise<void>;
109
383
  emitNext(): void;
110
384
  emitPrev(): void;
111
- static ɵfac: i0.ɵɵFactoryDeclaration<SmartPlayerComponent, never>;
112
- static ɵcmp: i0.ɵɵComponentDeclaration<SmartPlayerComponent, "ngx-smart-player", never, { "config": { "alias": "config"; "required": true; }; "plugins": { "alias": "plugins"; "required": false; }; "ports": { "alias": "ports"; "required": false; }; "engines": { "alias": "engines"; "required": false; }; "debug": { "alias": "debug"; "required": false; }; "startTimeSec": { "alias": "startTimeSec"; "required": false; }; "canPrev": { "alias": "canPrev"; "required": false; }; "canNext": { "alias": "canNext"; "required": false; }; "shuffleActive": { "alias": "shuffleActive"; "required": false; }; "shuffleLabel": { "alias": "shuffleLabel"; "required": false; }; "repeatMode": { "alias": "repeatMode"; "required": false; }; "repeatLabel": { "alias": "repeatLabel"; "required": false; }; "hasPlaylistControls": { "alias": "hasPlaylistControls"; "required": false; }; }, { "ended": "ended"; "videoSize": "videoSize"; "progress": "progress"; "prev": "prev"; "next": "next"; "toggleShuffle": "toggleShuffle"; "cycleRepeat": "cycleRepeat"; "subtitles": "subtitles"; }, never, never, true, never>;
385
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SmartPlayerComponent, never>;
386
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SmartPlayerComponent, "ngx-smart-player", never, { "config": { "alias": "config"; "required": true; }; "plugins": { "alias": "plugins"; "required": false; }; "ports": { "alias": "ports"; "required": false; }; "engines": { "alias": "engines"; "required": false; }; "debug": { "alias": "debug"; "required": false; }; "startTimeSec": { "alias": "startTimeSec"; "required": false; }; "autoplayOnInit": { "alias": "autoplayOnInit"; "required": false; }; "playRequest": { "alias": "playRequest"; "required": false; }; "canPrev": { "alias": "canPrev"; "required": false; }; "canNext": { "alias": "canNext"; "required": false; }; "previousLabel": { "alias": "previousLabel"; "required": false; }; "nextLabel": { "alias": "nextLabel"; "required": false; }; "playLabel": { "alias": "playLabel"; "required": false; }; "pauseLabel": { "alias": "pauseLabel"; "required": false; }; "shuffleActive": { "alias": "shuffleActive"; "required": false; }; "shuffleLabel": { "alias": "shuffleLabel"; "required": false; }; "repeatMode": { "alias": "repeatMode"; "required": false; }; "repeatLabel": { "alias": "repeatLabel"; "required": false; }; "hasPlaylistControls": { "alias": "hasPlaylistControls"; "required": false; }; "mediaMode": { "alias": "mediaMode"; "required": false; }; "castEnabled": { "alias": "castEnabled"; "required": false; }; "castConnected": { "alias": "castConnected"; "required": false; }; "documentShortcuts": { "alias": "documentShortcuts"; "required": false; }; "nowPlayingLabel": { "alias": "nowPlayingLabel"; "required": false; }; "nowListeningLabel": { "alias": "nowListeningLabel"; "required": false; }; "fullscreenHintLabel": { "alias": "fullscreenHintLabel"; "required": false; }; "fullscreenLabel": { "alias": "fullscreenLabel"; "required": false; }; "readyStatusLabel": { "alias": "readyStatusLabel"; "required": false; }; "playingStatusLabel": { "alias": "playingStatusLabel"; "required": false; }; "pausedStatusLabel": { "alias": "pausedStatusLabel"; "required": false; }; "bufferingStatusLabel": { "alias": "bufferingStatusLabel"; "required": false; }; "loadingStatusLabel": { "alias": "loadingStatusLabel"; "required": false; }; "endedStatusLabel": { "alias": "endedStatusLabel"; "required": false; }; "errorStatusLabel": { "alias": "errorStatusLabel"; "required": false; }; "outputVolume": { "alias": "outputVolume"; "required": false; }; "outputVolumeLabel": { "alias": "outputVolumeLabel"; "required": false; }; "outputMuteLabel": { "alias": "outputMuteLabel"; "required": false; }; "outputUnmuteLabel": { "alias": "outputUnmuteLabel"; "required": false; }; "timelineDurationSec": { "alias": "timelineDurationSec"; "required": false; }; "timelineMarkers": { "alias": "timelineMarkers"; "required": false; }; "menuLabels": { "alias": "menuLabels"; "required": false; }; }, { "ended": "ended"; "videoSize": "videoSize"; "progress": "progress"; "prev": "prev"; "next": "next"; "toggleShuffle": "toggleShuffle"; "cycleRepeat": "cycleRepeat"; "subtitles": "subtitles"; "subtitlesLoaded": "subtitlesLoaded"; "cast": "cast"; "stateChange": "stateChange"; "playbackToggle": "playbackToggle"; "outputVolumeChange": "outputVolumeChange"; }, never, ["[ngxsp-player-inline-controls]"], true, never>;
387
+ }
388
+
389
+ type RepeatMode = 'off' | 'one' | 'all';
390
+ type PlayerMenuKind = 'tracks' | 'speed';
391
+ /**
392
+ * Barre de contrôle du skin classique, extraite du SmartPlayerComponent
393
+ * (décomposition, cf. docs/AUDIT.md). Sans accès au moteur ni au <video> :
394
+ * reçoit l'état + les capacités (cast/PiP) en entrée et émet les commandes ;
395
+ * l'hôte applique l'action (et possède l'élément vidéo pour PiP/cast).
396
+ */
397
+ declare class PlayerControlsComponent {
398
+ readonly playing: _angular_core.InputSignal<boolean>;
399
+ readonly isAudioMode: _angular_core.InputSignal<boolean>;
400
+ readonly hasPlaylistControls: _angular_core.InputSignal<boolean>;
401
+ readonly canPrev: _angular_core.InputSignal<boolean>;
402
+ readonly canNext: _angular_core.InputSignal<boolean>;
403
+ readonly shuffleActive: _angular_core.InputSignal<boolean>;
404
+ readonly shuffleLabel: _angular_core.InputSignal<string>;
405
+ readonly repeatMode: _angular_core.InputSignal<RepeatMode>;
406
+ readonly repeatLabel: _angular_core.InputSignal<string>;
407
+ readonly captionsActive: _angular_core.InputSignal<boolean>;
408
+ readonly tracksLabel: _angular_core.InputSignal<string>;
409
+ readonly captionsLabel: _angular_core.InputSignal<string>;
410
+ readonly speedLabel: _angular_core.InputSignal<string>;
411
+ readonly volumeLabel: _angular_core.InputSignal<string>;
412
+ readonly muteLabel: _angular_core.InputSignal<string>;
413
+ readonly unmuteLabel: _angular_core.InputSignal<string>;
414
+ readonly showAirPlay: _angular_core.InputSignal<boolean>;
415
+ readonly airPlayActive: _angular_core.InputSignal<boolean>;
416
+ readonly airPlayLabel: _angular_core.InputSignal<string>;
417
+ readonly showCast: _angular_core.InputSignal<boolean>;
418
+ readonly castActive: _angular_core.InputSignal<boolean>;
419
+ readonly castLabel: _angular_core.InputSignal<string>;
420
+ readonly castHint: _angular_core.InputSignal<string>;
421
+ readonly pipSupported: _angular_core.InputSignal<boolean>;
422
+ readonly pipActive: _angular_core.InputSignal<boolean>;
423
+ readonly pipLabel: _angular_core.InputSignal<string>;
424
+ readonly volume: _angular_core.InputSignal<number>;
425
+ readonly currentTime: _angular_core.InputSignal<number>;
426
+ readonly duration: _angular_core.InputSignal<number>;
427
+ readonly buffered: _angular_core.InputSignal<number>;
428
+ readonly profile: _angular_core.InputSignal<SourceProfile>;
429
+ readonly playToggle: _angular_core.OutputEmitterRef<void>;
430
+ readonly seekRelative: _angular_core.OutputEmitterRef<number>;
431
+ readonly prev: _angular_core.OutputEmitterRef<void>;
432
+ readonly next: _angular_core.OutputEmitterRef<void>;
433
+ readonly toggleShuffle: _angular_core.OutputEmitterRef<void>;
434
+ readonly cycleRepeat: _angular_core.OutputEmitterRef<void>;
435
+ readonly openMenu: _angular_core.OutputEmitterRef<PlayerMenuKind>;
436
+ readonly captions: _angular_core.OutputEmitterRef<void>;
437
+ readonly airPlay: _angular_core.OutputEmitterRef<void>;
438
+ readonly cast: _angular_core.OutputEmitterRef<void>;
439
+ readonly pip: _angular_core.OutputEmitterRef<void>;
440
+ readonly mute: _angular_core.OutputEmitterRef<void>;
441
+ readonly scrub: _angular_core.OutputEmitterRef<number>;
442
+ readonly volumeChange: _angular_core.OutputEmitterRef<number>;
443
+ fmtTime(sec: number): string;
444
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PlayerControlsComponent, never>;
445
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PlayerControlsComponent, "ngxsp-player-controls", never, { "playing": { "alias": "playing"; "required": false; "isSignal": true; }; "isAudioMode": { "alias": "isAudioMode"; "required": false; "isSignal": true; }; "hasPlaylistControls": { "alias": "hasPlaylistControls"; "required": false; "isSignal": true; }; "canPrev": { "alias": "canPrev"; "required": false; "isSignal": true; }; "canNext": { "alias": "canNext"; "required": false; "isSignal": true; }; "shuffleActive": { "alias": "shuffleActive"; "required": false; "isSignal": true; }; "shuffleLabel": { "alias": "shuffleLabel"; "required": false; "isSignal": true; }; "repeatMode": { "alias": "repeatMode"; "required": false; "isSignal": true; }; "repeatLabel": { "alias": "repeatLabel"; "required": false; "isSignal": true; }; "captionsActive": { "alias": "captionsActive"; "required": false; "isSignal": true; }; "tracksLabel": { "alias": "tracksLabel"; "required": false; "isSignal": true; }; "captionsLabel": { "alias": "captionsLabel"; "required": false; "isSignal": true; }; "speedLabel": { "alias": "speedLabel"; "required": false; "isSignal": true; }; "volumeLabel": { "alias": "volumeLabel"; "required": false; "isSignal": true; }; "muteLabel": { "alias": "muteLabel"; "required": false; "isSignal": true; }; "unmuteLabel": { "alias": "unmuteLabel"; "required": false; "isSignal": true; }; "showAirPlay": { "alias": "showAirPlay"; "required": false; "isSignal": true; }; "airPlayActive": { "alias": "airPlayActive"; "required": false; "isSignal": true; }; "airPlayLabel": { "alias": "airPlayLabel"; "required": false; "isSignal": true; }; "showCast": { "alias": "showCast"; "required": false; "isSignal": true; }; "castActive": { "alias": "castActive"; "required": false; "isSignal": true; }; "castLabel": { "alias": "castLabel"; "required": false; "isSignal": true; }; "castHint": { "alias": "castHint"; "required": false; "isSignal": true; }; "pipSupported": { "alias": "pipSupported"; "required": false; "isSignal": true; }; "pipActive": { "alias": "pipActive"; "required": false; "isSignal": true; }; "pipLabel": { "alias": "pipLabel"; "required": false; "isSignal": true; }; "volume": { "alias": "volume"; "required": false; "isSignal": true; }; "currentTime": { "alias": "currentTime"; "required": false; "isSignal": true; }; "duration": { "alias": "duration"; "required": false; "isSignal": true; }; "buffered": { "alias": "buffered"; "required": false; "isSignal": true; }; "profile": { "alias": "profile"; "required": false; "isSignal": true; }; }, { "playToggle": "playToggle"; "seekRelative": "seekRelative"; "prev": "prev"; "next": "next"; "toggleShuffle": "toggleShuffle"; "cycleRepeat": "cycleRepeat"; "openMenu": "openMenu"; "captions": "captions"; "airPlay": "airPlay"; "cast": "cast"; "pip": "pip"; "mute": "mute"; "scrub": "scrub"; "volumeChange": "volumeChange"; }, never, never, true, never>;
446
+ }
447
+
448
+ /**
449
+ * Barre de contrôle du skin vod (top bar + center dock + bottom bar),
450
+ * extraite du SmartPlayerComponent (décomposition, cf. docs/AUDIT.md).
451
+ * Le menu pistes/vitesse est projeté par l'hôte via <ng-content>.
452
+ * PiP/cast restent au parent (propriétaire du <video>) : capacités en entrée,
453
+ * commandes en sortie.
454
+ */
455
+ declare class PlayerControlsVodComponent {
456
+ readonly playing: _angular_core.InputSignal<boolean>;
457
+ readonly isAudioMode: _angular_core.InputSignal<boolean>;
458
+ readonly displayTitle: _angular_core.InputSignal<string>;
459
+ readonly nowPlayingLabel: _angular_core.InputSignal<string>;
460
+ readonly nowListeningLabel: _angular_core.InputSignal<string>;
461
+ readonly fullscreenHintLabel: _angular_core.InputSignal<string>;
462
+ readonly statusLabel: _angular_core.InputSignal<string>;
463
+ readonly keyboardHint: _angular_core.InputSignal<string>;
464
+ readonly hasPlaylistControls: _angular_core.InputSignal<boolean>;
465
+ readonly canPrev: _angular_core.InputSignal<boolean>;
466
+ readonly canNext: _angular_core.InputSignal<boolean>;
467
+ readonly previousLabel: _angular_core.InputSignal<string>;
468
+ readonly nextLabel: _angular_core.InputSignal<string>;
469
+ readonly playLabel: _angular_core.InputSignal<string>;
470
+ readonly pauseLabel: _angular_core.InputSignal<string>;
471
+ readonly shuffleActive: _angular_core.InputSignal<boolean>;
472
+ readonly shuffleLabel: _angular_core.InputSignal<string>;
473
+ readonly repeatMode: _angular_core.InputSignal<RepeatMode>;
474
+ readonly repeatLabel: _angular_core.InputSignal<string>;
475
+ readonly captionsActive: _angular_core.InputSignal<boolean>;
476
+ readonly tracksLabel: _angular_core.InputSignal<string>;
477
+ readonly captionsLabel: _angular_core.InputSignal<string>;
478
+ readonly speedLabel: _angular_core.InputSignal<string>;
479
+ /** "1×", "1.5×": the rate on the speed pill. */
480
+ readonly speedBadge: _angular_core.Signal<string>;
481
+ readonly volumeLabel: _angular_core.InputSignal<string>;
482
+ readonly muteLabel: _angular_core.InputSignal<string>;
483
+ readonly unmuteLabel: _angular_core.InputSignal<string>;
484
+ readonly showAirPlay: _angular_core.InputSignal<boolean>;
485
+ readonly airPlayActive: _angular_core.InputSignal<boolean>;
486
+ readonly airPlayLabel: _angular_core.InputSignal<string>;
487
+ readonly showCast: _angular_core.InputSignal<boolean>;
488
+ readonly castActive: _angular_core.InputSignal<boolean>;
489
+ readonly castLabel: _angular_core.InputSignal<string>;
490
+ readonly castHint: _angular_core.InputSignal<string>;
491
+ readonly pipSupported: _angular_core.InputSignal<boolean>;
492
+ readonly pipActive: _angular_core.InputSignal<boolean>;
493
+ readonly pipLabel: _angular_core.InputSignal<string>;
494
+ readonly fullscreenLabel: _angular_core.InputSignal<string>;
495
+ readonly volume: _angular_core.InputSignal<number>;
496
+ readonly currentTime: _angular_core.InputSignal<number>;
497
+ readonly duration: _angular_core.InputSignal<number>;
498
+ readonly buffered: _angular_core.InputSignal<number>;
499
+ readonly bufferPercent: _angular_core.InputSignal<number>;
500
+ readonly profile: _angular_core.InputSignal<SourceProfile>;
501
+ readonly timelineDurationSec: _angular_core.InputSignal<number>;
502
+ readonly timelineMarkers: _angular_core.InputSignal<readonly NgxspTimelineMarker[]>;
503
+ readonly playToggle: _angular_core.OutputEmitterRef<void>;
504
+ readonly seekRelative: _angular_core.OutputEmitterRef<number>;
505
+ readonly prev: _angular_core.OutputEmitterRef<void>;
506
+ readonly next: _angular_core.OutputEmitterRef<void>;
507
+ readonly toggleShuffle: _angular_core.OutputEmitterRef<void>;
508
+ readonly cycleRepeat: _angular_core.OutputEmitterRef<void>;
509
+ readonly openMenu: _angular_core.OutputEmitterRef<PlayerMenuKind>;
510
+ readonly captions: _angular_core.OutputEmitterRef<void>;
511
+ readonly airPlay: _angular_core.OutputEmitterRef<void>;
512
+ readonly cast: _angular_core.OutputEmitterRef<void>;
513
+ readonly pip: _angular_core.OutputEmitterRef<void>;
514
+ readonly fullscreen: _angular_core.OutputEmitterRef<void>;
515
+ readonly mute: _angular_core.OutputEmitterRef<void>;
516
+ readonly scrub: _angular_core.OutputEmitterRef<number>;
517
+ readonly volumeChange: _angular_core.OutputEmitterRef<number>;
518
+ fmtTime(sec: number): string;
519
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PlayerControlsVodComponent, never>;
520
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PlayerControlsVodComponent, "ngxsp-player-controls-vod", never, { "playing": { "alias": "playing"; "required": false; "isSignal": true; }; "isAudioMode": { "alias": "isAudioMode"; "required": false; "isSignal": true; }; "displayTitle": { "alias": "displayTitle"; "required": false; "isSignal": true; }; "nowPlayingLabel": { "alias": "nowPlayingLabel"; "required": false; "isSignal": true; }; "nowListeningLabel": { "alias": "nowListeningLabel"; "required": false; "isSignal": true; }; "fullscreenHintLabel": { "alias": "fullscreenHintLabel"; "required": false; "isSignal": true; }; "statusLabel": { "alias": "statusLabel"; "required": false; "isSignal": true; }; "keyboardHint": { "alias": "keyboardHint"; "required": false; "isSignal": true; }; "hasPlaylistControls": { "alias": "hasPlaylistControls"; "required": false; "isSignal": true; }; "canPrev": { "alias": "canPrev"; "required": false; "isSignal": true; }; "canNext": { "alias": "canNext"; "required": false; "isSignal": true; }; "previousLabel": { "alias": "previousLabel"; "required": false; "isSignal": true; }; "nextLabel": { "alias": "nextLabel"; "required": false; "isSignal": true; }; "playLabel": { "alias": "playLabel"; "required": false; "isSignal": true; }; "pauseLabel": { "alias": "pauseLabel"; "required": false; "isSignal": true; }; "shuffleActive": { "alias": "shuffleActive"; "required": false; "isSignal": true; }; "shuffleLabel": { "alias": "shuffleLabel"; "required": false; "isSignal": true; }; "repeatMode": { "alias": "repeatMode"; "required": false; "isSignal": true; }; "repeatLabel": { "alias": "repeatLabel"; "required": false; "isSignal": true; }; "captionsActive": { "alias": "captionsActive"; "required": false; "isSignal": true; }; "tracksLabel": { "alias": "tracksLabel"; "required": false; "isSignal": true; }; "captionsLabel": { "alias": "captionsLabel"; "required": false; "isSignal": true; }; "speedLabel": { "alias": "speedLabel"; "required": false; "isSignal": true; }; "volumeLabel": { "alias": "volumeLabel"; "required": false; "isSignal": true; }; "muteLabel": { "alias": "muteLabel"; "required": false; "isSignal": true; }; "unmuteLabel": { "alias": "unmuteLabel"; "required": false; "isSignal": true; }; "showAirPlay": { "alias": "showAirPlay"; "required": false; "isSignal": true; }; "airPlayActive": { "alias": "airPlayActive"; "required": false; "isSignal": true; }; "airPlayLabel": { "alias": "airPlayLabel"; "required": false; "isSignal": true; }; "showCast": { "alias": "showCast"; "required": false; "isSignal": true; }; "castActive": { "alias": "castActive"; "required": false; "isSignal": true; }; "castLabel": { "alias": "castLabel"; "required": false; "isSignal": true; }; "castHint": { "alias": "castHint"; "required": false; "isSignal": true; }; "pipSupported": { "alias": "pipSupported"; "required": false; "isSignal": true; }; "pipActive": { "alias": "pipActive"; "required": false; "isSignal": true; }; "pipLabel": { "alias": "pipLabel"; "required": false; "isSignal": true; }; "fullscreenLabel": { "alias": "fullscreenLabel"; "required": false; "isSignal": true; }; "volume": { "alias": "volume"; "required": false; "isSignal": true; }; "currentTime": { "alias": "currentTime"; "required": false; "isSignal": true; }; "duration": { "alias": "duration"; "required": false; "isSignal": true; }; "buffered": { "alias": "buffered"; "required": false; "isSignal": true; }; "bufferPercent": { "alias": "bufferPercent"; "required": false; "isSignal": true; }; "profile": { "alias": "profile"; "required": false; "isSignal": true; }; "timelineDurationSec": { "alias": "timelineDurationSec"; "required": false; "isSignal": true; }; "timelineMarkers": { "alias": "timelineMarkers"; "required": false; "isSignal": true; }; }, { "playToggle": "playToggle"; "seekRelative": "seekRelative"; "prev": "prev"; "next": "next"; "toggleShuffle": "toggleShuffle"; "cycleRepeat": "cycleRepeat"; "openMenu": "openMenu"; "captions": "captions"; "airPlay": "airPlay"; "cast": "cast"; "pip": "pip"; "fullscreen": "fullscreen"; "mute": "mute"; "scrub": "scrub"; "volumeChange": "volumeChange"; }, never, ["[ngxsp-player-inline-controls]", "ngxsp-player-menu"], true, never>;
113
521
  }
114
522
 
523
+ /**
524
+ * Skin « édition » du lecteur : registre instrument (cf. docs/UX_VISION.md).
525
+ * Titre display, coins francs, libellés en capitales, accent champagne, et le
526
+ * traitement direct (NgxspLiveBadge + « Au direct ») en profil `live`.
527
+ * Compose les primitives de @ngxsp/ui-core. Le menu est projeté via <ng-content>.
528
+ */
529
+ declare class PlayerControlsEditionComponent {
530
+ readonly profile: _angular_core.InputSignal<SourceProfile>;
531
+ readonly playing: _angular_core.InputSignal<boolean>;
532
+ readonly displayTitle: _angular_core.InputSignal<string>;
533
+ readonly metaLabel: _angular_core.InputSignal<string>;
534
+ readonly statusLabel: _angular_core.InputSignal<string>;
535
+ readonly behindSec: _angular_core.InputSignal<number>;
536
+ readonly liveLabel: _angular_core.InputSignal<string>;
537
+ readonly captionsActive: _angular_core.InputSignal<boolean>;
538
+ readonly speedLabel: _angular_core.InputSignal<string>;
539
+ readonly showAirPlay: _angular_core.InputSignal<boolean>;
540
+ readonly airPlayActive: _angular_core.InputSignal<boolean>;
541
+ readonly airPlayLabel: _angular_core.InputSignal<string>;
542
+ readonly showCast: _angular_core.InputSignal<boolean>;
543
+ readonly castActive: _angular_core.InputSignal<boolean>;
544
+ readonly pipSupported: _angular_core.InputSignal<boolean>;
545
+ readonly pipActive: _angular_core.InputSignal<boolean>;
546
+ readonly volume: _angular_core.InputSignal<number>;
547
+ readonly volumeLabel: _angular_core.InputSignal<string>;
548
+ readonly muteLabel: _angular_core.InputSignal<string>;
549
+ readonly unmuteLabel: _angular_core.InputSignal<string>;
550
+ readonly currentTime: _angular_core.InputSignal<number>;
551
+ readonly duration: _angular_core.InputSignal<number>;
552
+ readonly buffered: _angular_core.InputSignal<number>;
553
+ readonly playToggle: _angular_core.OutputEmitterRef<void>;
554
+ readonly seekRelative: _angular_core.OutputEmitterRef<number>;
555
+ readonly openMenu: _angular_core.OutputEmitterRef<PlayerMenuKind>;
556
+ readonly captions: _angular_core.OutputEmitterRef<void>;
557
+ readonly airPlay: _angular_core.OutputEmitterRef<void>;
558
+ readonly cast: _angular_core.OutputEmitterRef<void>;
559
+ readonly pip: _angular_core.OutputEmitterRef<void>;
560
+ readonly mute: _angular_core.OutputEmitterRef<void>;
561
+ readonly scrub: _angular_core.OutputEmitterRef<number>;
562
+ readonly volumeChange: _angular_core.OutputEmitterRef<number>;
563
+ readonly goLive: _angular_core.OutputEmitterRef<void>;
564
+ fmtTime(sec: number): string;
565
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PlayerControlsEditionComponent, never>;
566
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PlayerControlsEditionComponent, "ngxsp-player-controls-edition", never, { "profile": { "alias": "profile"; "required": false; "isSignal": true; }; "playing": { "alias": "playing"; "required": false; "isSignal": true; }; "displayTitle": { "alias": "displayTitle"; "required": false; "isSignal": true; }; "metaLabel": { "alias": "metaLabel"; "required": false; "isSignal": true; }; "statusLabel": { "alias": "statusLabel"; "required": false; "isSignal": true; }; "behindSec": { "alias": "behindSec"; "required": false; "isSignal": true; }; "liveLabel": { "alias": "liveLabel"; "required": false; "isSignal": true; }; "captionsActive": { "alias": "captionsActive"; "required": false; "isSignal": true; }; "speedLabel": { "alias": "speedLabel"; "required": false; "isSignal": true; }; "showAirPlay": { "alias": "showAirPlay"; "required": false; "isSignal": true; }; "airPlayActive": { "alias": "airPlayActive"; "required": false; "isSignal": true; }; "airPlayLabel": { "alias": "airPlayLabel"; "required": false; "isSignal": true; }; "showCast": { "alias": "showCast"; "required": false; "isSignal": true; }; "castActive": { "alias": "castActive"; "required": false; "isSignal": true; }; "pipSupported": { "alias": "pipSupported"; "required": false; "isSignal": true; }; "pipActive": { "alias": "pipActive"; "required": false; "isSignal": true; }; "volume": { "alias": "volume"; "required": false; "isSignal": true; }; "volumeLabel": { "alias": "volumeLabel"; "required": false; "isSignal": true; }; "muteLabel": { "alias": "muteLabel"; "required": false; "isSignal": true; }; "unmuteLabel": { "alias": "unmuteLabel"; "required": false; "isSignal": true; }; "currentTime": { "alias": "currentTime"; "required": false; "isSignal": true; }; "duration": { "alias": "duration"; "required": false; "isSignal": true; }; "buffered": { "alias": "buffered"; "required": false; "isSignal": true; }; }, { "playToggle": "playToggle"; "seekRelative": "seekRelative"; "openMenu": "openMenu"; "captions": "captions"; "airPlay": "airPlay"; "cast": "cast"; "pip": "pip"; "mute": "mute"; "scrub": "scrub"; "volumeChange": "volumeChange"; "goLive": "goLive"; }, never, ["*"], true, never>;
567
+ }
568
+
569
+ /**
570
+ * Jetons d'injection typés pour les providers de sous-titres / métadonnées.
571
+ * (Remplace les jetons `string` non typés — cf. docs/AUDIT.md, manquement #10.)
572
+ * Un consommateur peut les injecter directement :
573
+ * `inject(SMART_PLAYER_SUBTITLE_PROVIDERS)`.
574
+ */
575
+ declare const SMART_PLAYER_SUBTITLE_PROVIDERS: InjectionToken<SubtitleProvider[]>;
576
+ declare const SMART_PLAYER_METADATA_PROVIDERS: InjectionToken<MetadataProvider[]>;
115
577
  interface SmartPlayerProvidersConfig {
116
578
  subtitleProviders?: SubtitleProvider[];
117
579
  metadataProviders?: MetadataProvider[];
118
580
  }
119
581
  /**
120
- * Register provider implementations for subtitles/metadata.
121
- * You can call this in your app `bootstrapApplication()` providers array.
582
+ * Enregistre les implémentations de providers (sous-titres / métadonnées).
583
+ * À appeler dans le tableau `providers` de `bootstrapApplication()`.
122
584
  */
123
585
  declare function provideSmartPlayer(cfg: SmartPlayerProvidersConfig): EnvironmentProviders;
124
586
 
125
- export { SmartPlayerComponent, provideSmartPlayer };
126
- export type { SmartPlayerProvidersConfig };
587
+ export { DEFAULT_PLAYER_MENU_LABELS, PlayerControlsComponent, PlayerControlsEditionComponent, PlayerControlsVodComponent, SMART_PLAYER_METADATA_PROVIDERS, SMART_PLAYER_SUBTITLE_PROVIDERS, SmartConfirmDialogComponent, SmartPlayerComponent, SmartPlayerIconComponent, SmartSettingsComponent, provideSmartPlayer };
588
+ export type { RepeatMode as PlayerControlsRepeatMode, PlayerMenuKind, PlayerMenuLabels, SmartCompactMode, SmartPlayerIconName, SmartPlayerProgress, SmartPlayerProvidersConfig, SmartSettingAction, SmartSettingChange, SmartSettingEntry, SmartSettingItem, SmartSettingOption, SmartSettingsSection };