@eluvio/elv-player-js 2.0.21 → 2.0.23

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.
@@ -9,7 +9,14 @@ import {ImageUrl, PlayerClick, Time} from "./Common.js";
9
9
  import EluvioPlayerParameters from "../player/PlayerParameters.js";
10
10
 
11
11
  import EluvioLogo from "../static/images/Logo.png";
12
- import {CollectionMenu, ContentVerificationMenu, SeekBar, SettingsMenu, SVG, VolumeControls} from "./Components.jsx";
12
+ import {
13
+ CollectionMenu,
14
+ ContentVerificationMenu,
15
+ DVRToggle,
16
+ SeekBar,
17
+ SettingsMenu,
18
+ SVG
19
+ } from "./Components.jsx";
13
20
 
14
21
  export const IconButton = ({icon, ...props}) => {
15
22
  return (
@@ -21,7 +28,7 @@ const TimeIndicator = ({player, videoState}) => {
21
28
  const [currentTime, setCurrentTime] = useState(player.video.currentTime);
22
29
 
23
30
  useEffect(() => {
24
- const disposeVideoTimeObserver = ObserveVideoTime({video: player.video, setCurrentTime, rate: 10});
31
+ const disposeVideoTimeObserver = ObserveVideoTime({player, setCurrentTime, rate: 10});
25
32
 
26
33
  return () => disposeVideoTimeObserver && disposeVideoTimeObserver();
27
34
  }, []);
@@ -250,7 +257,7 @@ const TVControls = ({player, playbackStarted, canPlay, recentlyInteracted, setRe
250
257
  useEffect(() => {
251
258
  setPlayerClickHandler(PlayerClick({player, setRecentUserAction}));
252
259
 
253
- const disposeVideoObserver = ObserveVideo({target: player.target, video: player.video, setVideoState});
260
+ const disposeVideoObserver = ObserveVideo({player, setVideoState});
254
261
 
255
262
  return () => disposeVideoObserver && disposeVideoObserver();
256
263
  }, []);
@@ -290,7 +297,7 @@ const TVControls = ({player, playbackStarted, canPlay, recentlyInteracted, setRe
290
297
  // Take focus off of this button because it should no longer be selectable after playback starts
291
298
  player.target.firstChild.focus();
292
299
  }}
293
- className={`${ControlStyles["center-play-button"]} ${ControlStyles["icon-button--drop-shadow-focus"]} ${canPlay && !playbackStarted ? "" : ControlStyles["center-play-button--hidden"]}`}
300
+ className={`${ControlStyles["center-play-button"]} ${ControlStyles["icon-button--drop-shadow-focus"]} ${(canPlay && !playbackStarted && !player.casting) ? "" : ControlStyles["center-play-button--hidden"]}`}
294
301
  />
295
302
  {
296
303
  showInfo ?
@@ -309,13 +316,8 @@ const TVControls = ({player, playbackStarted, canPlay, recentlyInteracted, setRe
309
316
  <div className={ControlStyles["spacer"]}/>
310
317
  {
311
318
  !player.isLive ? null :
312
- player.dvrEnabled ?
313
- <button
314
- onClick={() => player.controls.Seek({time: player.controls.GetDuration() - 2})}
315
- className={`${ControlStyles["live-indicator"]} ${player.isLive && player.behindLiveEdge ? ControlStyles["live-indicator--faded"] : ""}`}
316
- >
317
- Live
318
- </button> :
319
+ player.controls.IsDVRAvailable() ?
320
+ <DVRToggle player={player} /> :
319
321
  <div className={ControlStyles["live-indicator"]}>
320
322
  Live
321
323
  </div>
@@ -343,6 +345,18 @@ const TVControls = ({player, playbackStarted, canPlay, recentlyInteracted, setRe
343
345
  <CenterButtons player={player} videoState={videoState}/>
344
346
  <div className={ControlStyles["bottom-right-controls"]}>
345
347
  <ContentVerificationControls player={player} />
348
+ {
349
+ !player.airplayAvailable ? null :
350
+ <IconButton
351
+ aria-label="Airplay"
352
+ onClick={() => player.video.webkitShowPlaybackTargetPicker()}
353
+ icon={Icons.AirplayIcon}
354
+ />
355
+ }
356
+ {
357
+ !player.chromecastAvailable ? null :
358
+ <google-cast-launcher></google-cast-launcher>
359
+ }
346
360
  {
347
361
  !player.controls.GetOptions().hasAnyOptions ? null :
348
362
  <MenuButton
@@ -9,7 +9,7 @@ import {ImageUrl, PlayerClick, Time} from "./Common.js";
9
9
  import EluvioPlayerParameters from "../player/PlayerParameters.js";
10
10
 
11
11
  import EluvioLogo from "../static/images/Logo.png";
12
- import {CollectionMenu, ContentVerificationMenu, SeekBar, SettingsMenu, VolumeControls} from "./Components.jsx";
12
+ import {ContentVerificationMenu, DVRToggle, SeekBar, SettingsMenu, VolumeControls} from "./Components.jsx";
13
13
 
14
14
  export const IconButton = ({icon, className="", ...props}) => {
15
15
  return (
@@ -21,12 +21,12 @@ const TimeIndicator = ({player, videoState}) => {
21
21
  const [currentTime, setCurrentTime] = useState(player.video.currentTime);
22
22
 
23
23
  useEffect(() => {
24
- const disposeVideoTimeObserver = ObserveVideoTime({video: player.video, setCurrentTime, rate: 10});
24
+ const disposeVideoTimeObserver = ObserveVideoTime({player, setCurrentTime, rate: 10});
25
25
 
26
26
  return () => disposeVideoTimeObserver && disposeVideoTimeObserver();
27
27
  }, []);
28
28
 
29
- if(player.isLive && !player.dvrEnabled) {
29
+ if(player.isLive && !player.controls.IsDVRAvailable()) {
30
30
  return (
31
31
  <div className={ControlStyles["live-indicator"]}>
32
32
  Live
@@ -37,19 +37,17 @@ const TimeIndicator = ({player, videoState}) => {
37
37
  return (
38
38
  <div className={ControlStyles["time"]}>
39
39
  {
40
- !player.isLive ? null :
41
- <button
42
- onClick={() => player.controls.Seek({time: player.controls.GetDuration() - 2})}
43
- className={`${ControlStyles["live-indicator"]} ${player.isLive && player.behindLiveEdge ? ControlStyles["live-indicator--faded"] : ""}`}
44
- >
45
- Live
46
- </button>
40
+ !player.isLive || !player.controls.IsDVRAvailable() ? null :
41
+ <DVRToggle player={player} />
47
42
  }
48
43
  {
49
44
  player.isLive && !player.behindLiveEdge ? null :
50
45
  `${Time(currentTime, videoState.duration)} / `
51
46
  }
52
- { Time(videoState.duration, videoState.duration) }
47
+ {
48
+ !player.dvrEnabled ? null :
49
+ Time(videoState.duration, videoState.duration)
50
+ }
53
51
  </div>
54
52
  );
55
53
  };
@@ -171,11 +169,11 @@ const ContentVerificationControls = ({player}) => {
171
169
  const [contentVerified, setContentVerified] = useState(false);
172
170
 
173
171
  useEffect(() => {
174
- const UpdateVerification = () => setContentVerified(player.controls.ContentVerified());
172
+ const UpdateVerification = () => player && player.controls && setContentVerified(player.controls.ContentVerified());
175
173
 
176
174
  UpdateVerification();
177
175
 
178
- const disposeSettingsListener = player.controls.RegisterSettingsListener(UpdateVerification);
176
+ const disposeSettingsListener = player.controls && player.controls.RegisterSettingsListener(UpdateVerification);
179
177
 
180
178
  return () => disposeSettingsListener && disposeSettingsListener();
181
179
  }, []);
@@ -206,12 +204,14 @@ const WebControls = ({player, playbackStarted, canPlay, recentlyInteracted, setR
206
204
  const [menuVisible, setMenuVisible] = useState(player.controls.IsMenuVisible());
207
205
 
208
206
  useEffect(() => {
207
+ if(!player.controls) { return; }
208
+
209
209
  setPlayerClickHandler(PlayerClick({player, setRecentUserAction}));
210
210
 
211
- const UpdateMenuVisibility = () => setMenuVisible(player.controls.IsMenuVisible());
211
+ const UpdateMenuVisibility = () => player && player.controls && setMenuVisible(player.controls.IsMenuVisible());
212
212
  const disposeSettingsListener = player.controls.RegisterSettingsListener(UpdateMenuVisibility);
213
213
 
214
- const disposeVideoObserver = ObserveVideo({target: player.target, video: player.video, setVideoState});
214
+ const disposeVideoObserver = ObserveVideo({player, setVideoState});
215
215
 
216
216
  return () => {
217
217
  disposeSettingsListener && disposeSettingsListener();
@@ -258,7 +258,7 @@ const WebControls = ({player, playbackStarted, canPlay, recentlyInteracted, setR
258
258
  // Take focus off of this button because it should no longer be selectable after playback starts
259
259
  player.target.firstChild.focus();
260
260
  }}
261
- className={`${ControlStyles["center-play-button"]} ${canPlay && !playbackStarted ? "" : ControlStyles["center-play-button--hidden"]}`}
261
+ className={`${ControlStyles["center-play-button"]} ${canPlay && !playbackStarted && !(player && player.casting) ? "" : ControlStyles["center-play-button--hidden"]}`}
262
262
  />
263
263
  <div className={`${ControlStyles["bottom-controls-container"]} ${hideControls ? ControlStyles["bottom-controls-container--autohide"] : ""}`}>
264
264
  <div className={ControlStyles["bottom-controls-gradient"]} />
@@ -270,23 +270,28 @@ const WebControls = ({player, playbackStarted, canPlay, recentlyInteracted, setR
270
270
  onClick={() => player.controls.TogglePlay()}
271
271
  className={ControlStyles["play-pause-button"]}
272
272
  />
273
- <CollectionControls player={player} />
274
- <VolumeControls player={player} videoState={videoState} />
273
+ <CollectionControls player={player}/>
274
+ <VolumeControls player={player} videoState={videoState}/>
275
275
  <TimeIndicator player={player} videoState={videoState}/>
276
276
 
277
277
  <div className={ControlStyles["spacer"]}/>
278
278
 
279
- <ContentVerificationControls player={player} />
279
+ <ContentVerificationControls player={player}/>
280
280
 
281
281
  {
282
- !collectionInfo ? null :
283
- <MenuButton
284
- label="Collection Menu"
285
- icon={Icons.CollectionIcon}
286
- player={player}
287
- MenuComponent={CollectionMenu}
282
+ !player.chromecastAvailable ? null :
283
+ <google-cast-launcher></google-cast-launcher>
284
+ }
285
+
286
+ {
287
+ !player.airplayAvailable ? null :
288
+ <IconButton
289
+ aria-label="Airplay"
290
+ onClick={() => player.video.webkitShowPlaybackTargetPicker()}
291
+ icon={Icons.AirplayIcon}
288
292
  />
289
293
  }
294
+
290
295
  {
291
296
  !player.controls.IsRotatable() ? null :
292
297
  <IconButton
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eluvio/elv-player-js",
3
- "version": "2.0.21",
3
+ "version": "2.0.23",
4
4
  "description": "![Eluvio Logo](lib/static/images/Logo.png \"Eluvio Logo\")",
5
5
  "main": "dist/elv-player-js.es.js",
6
6
  "license": "MIT",
@@ -36,7 +36,7 @@
36
36
  "package-lock.json"
37
37
  ],
38
38
  "dependencies": {
39
- "@eluvio/elv-client-js": "^4.0.92",
39
+ "@eluvio/elv-client-js": "^4.0.110",
40
40
  "dashjs": "~4.7.0",
41
41
  "focus-visible": "^5.2.0",
42
42
  "hls.js": "~1.5.12",
@@ -47,7 +47,7 @@
47
47
  "url-join": "^4.0.1"
48
48
  },
49
49
  "devDependencies": {
50
- "@vitejs/plugin-basic-ssl": "^1.1.0",
50
+ "@vitejs/plugin-basic-ssl": "^1.2.0",
51
51
  "@vitejs/plugin-react-swc": "^3.5.0",
52
52
  "autoprefixer": "^10.4.16",
53
53
  "babel-eslint": "^10.1.0",