@applicaster/quick-brick-player 13.0.0-alpha.3098550192 → 13.0.0-alpha.3121512604

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": "@applicaster/quick-brick-player",
3
- "version": "13.0.0-alpha.3098550192",
3
+ "version": "13.0.0-alpha.3121512604",
4
4
  "description": "Quick Brick Player",
5
5
  "main": "./src/index.ts",
6
6
  "types": "index.d.ts",
@@ -36,11 +36,11 @@
36
36
  },
37
37
  "homepage": "https://github.com/applicaster/quickbrick#readme",
38
38
  "dependencies": {
39
- "@applicaster/quick-brick-mobile-transport-controls": "13.0.0-rc.28",
40
- "@applicaster/quick-brick-tv-transport-controls": "13.0.0-rc.31",
41
- "@applicaster/zapp-react-native-tvos-app": "13.0.0-alpha.3098550192",
42
- "@applicaster/zapp-react-native-ui-components": "13.0.0-alpha.3098550192",
43
- "@applicaster/zapp-react-native-utils": "13.0.0-alpha.3098550192",
39
+ "@applicaster/quick-brick-mobile-transport-controls": "13.0.0-rc.63",
40
+ "@applicaster/quick-brick-tv-transport-controls": "13.0.0-rc.56",
41
+ "@applicaster/zapp-react-native-tvos-app": "13.0.0-alpha.3121512604",
42
+ "@applicaster/zapp-react-native-ui-components": "13.0.0-alpha.3121512604",
43
+ "@applicaster/zapp-react-native-utils": "13.0.0-alpha.3121512604",
44
44
  "keymirror": "^0.1.1",
45
45
  "query-string": "7.1.3",
46
46
  "react-native-web-linear-gradient": "1.1.2",
@@ -61,12 +61,9 @@
61
61
  "@applicaster/zapp-react-native-tvos-ui-components": "*",
62
62
  "@babel/runtime": "*",
63
63
  "@react-native-community/netinfo": "*",
64
- "@types/node": "*",
65
- "@types/react-native": "0.69.6",
66
64
  "immer": "*",
67
- "react": "17.0.2",
68
- "react-hot-loader": "*",
69
- "react-native": "0.68.6",
65
+ "react": "*",
66
+ "react-native": "*",
70
67
  "react-native-fs": "*",
71
68
  "react-native-gesture-handler": "*",
72
69
  "react-native-linear-gradient": "*",
@@ -55,6 +55,11 @@ const useMuteUnmuteListeners = (playerId, player, asset, setImageUri) =>
55
55
  return;
56
56
  }
57
57
 
58
+ // initial state setup - show correct mute/unmute icon based on current state
59
+ if (player?.playerState?.isReadyToPlay) {
60
+ setImageUri(player.getIsMuted() ? asset.active : asset.inactive);
61
+ }
62
+
58
63
  // active action = muted, inactive = unmuted
59
64
  return player.addListener({
60
65
  id: liveImageButtonsListenerKey,
@@ -73,10 +78,17 @@ const useMuteUnmuteListeners = (playerId, player, asset, setImageUri) =>
73
78
  setImageUri(player?.getIsMuted() ? asset.active : asset.inactive);
74
79
  },
75
80
  onPlayerClose: () => {
76
- setImageUri(null);
81
+ if (isCurrentPlayer(playerId)) {
82
+ setImageUri(null);
83
+ }
77
84
  },
78
85
  onVideoEnd: () => {
79
- setImageUri(null);
86
+ if (isCurrentPlayer(playerId)) {
87
+ setImageUri(null);
88
+ }
89
+ },
90
+ onPlayerResume: () => {
91
+ setImageUri(player?.getIsMuted() ? asset.active : asset.inactive);
80
92
  },
81
93
  },
82
94
  });
@@ -93,7 +105,7 @@ const styles = StyleSheet.create({
93
105
  },
94
106
  });
95
107
 
96
- export function AssetComponent(props: CellActionAssetComponentProps) {
108
+ function AssetImage(props: CellActionAssetComponentProps) {
97
109
  const { cellUUID: playerId, asset } = props;
98
110
  const [imageUri, setImageUri] = useState<Asset>(null);
99
111
 
@@ -108,3 +120,5 @@ export function AssetComponent(props: CellActionAssetComponentProps) {
108
120
 
109
121
  return <View />;
110
122
  }
123
+
124
+ export const AssetComponent = React.memo(AssetImage);
@@ -1,5 +1,5 @@
1
1
  import * as React from "react";
2
- import { ViewStyle, View } from "react-native";
2
+ import { ViewStyle, View, Dimensions as ScreenDimensions } from "react-native";
3
3
 
4
4
  import { SafeAreaView, Edge } from "react-native-safe-area-context";
5
5
  import { usePlayerState } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayerState";
@@ -40,6 +40,7 @@ import {
40
40
  SLEEP_TIMER_OFF,
41
41
  } from "./SleepTimerManager";
42
42
  import { SpeedController, PlaybackSpeed, DEFAULT_SPEED } from "./SpeedManager";
43
+ import { imageSrcFromMediaItem } from "@applicaster/zapp-react-native-utils/configurationUtils";
43
44
 
44
45
  const { log_debug } = createLogger({
45
46
  subsystem: "UIComponent",
@@ -78,8 +79,7 @@ type Props = {
78
79
  isTabletPortrait?: boolean;
79
80
  };
80
81
 
81
- export const defaultAspectRatioWidth = (height: number): number =>
82
- (height / 9) * 16;
82
+ const { width: SCREEN_WIDTH } = ScreenDimensions.get("screen");
83
83
 
84
84
  const Styles = {
85
85
  mainContainer: (style: ViewStyle) => {
@@ -105,7 +105,11 @@ const Styles = {
105
105
  height: 96,
106
106
  marginHorizontal: 24,
107
107
  },
108
- playerDetails: { marginTop: 60 },
108
+ playerDetails: {
109
+ marginTop: 60,
110
+ alignSelf: "center",
111
+ width: SCREEN_WIDTH - PADDING_HORIZONTAL * 2,
112
+ },
109
113
 
110
114
  linearGradient: {
111
115
  flex: 1,
@@ -442,14 +446,15 @@ export const AudioPlayerWrapper: React.FC<Props> = (props: Props) => {
442
446
  ]);
443
447
 
444
448
  if (configuration.magic_background) {
445
- const baseUrl = entry?.extensions?.audio_player_background_image ?? "";
449
+ const baseUrl = imageSrcFromMediaItem(entry, null);
446
450
 
447
451
  const queryParamName =
448
452
  configuration.audio_player_background_image_query || "width";
449
453
 
450
454
  const queryParamValue = 15;
451
455
 
452
- const url = addQueryParam(baseUrl, queryParamName, queryParamValue);
456
+ const url =
457
+ baseUrl && addQueryParam(baseUrl, queryParamName, queryParamValue);
453
458
 
454
459
  return (
455
460
  <MagicBG
@@ -1,13 +1,14 @@
1
1
  import * as React from "react";
2
+ import { useEffect, useMemo, useState } from "react";
2
3
  import * as R from "ramda";
3
- import { View } from "react-native";
4
+ import { View, Dimensions as ScreenDimensions } from "react-native";
4
5
  import { dayjs } from "@applicaster/zapp-react-native-utils/dateUtils";
5
6
 
6
7
  import {
7
- ProgressBar,
8
8
  Controls,
9
- TransportInfo,
10
9
  CountDown,
10
+ ProgressBar,
11
+ TransportInfo,
11
12
  } from "@applicaster/quick-brick-mobile-transport-controls";
12
13
 
13
14
  import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils";
@@ -15,23 +16,22 @@ import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils";
15
16
  import { useIsTablet } from "@applicaster/zapp-react-native-utils/reactHooks";
16
17
  import {
17
18
  forwardButton,
19
+ PADDING_HORIZONTAL,
18
20
  playbackButton,
19
21
  rewindButton,
20
- skipToStartButton,
21
22
  skipToLiveButton,
22
- PADDING_HORIZONTAL,
23
- speedButton,
23
+ skipToStartButton,
24
24
  sleepButton,
25
+ speedButton,
25
26
  } from "./defaultLayoutsConts";
26
27
  import { AudioDescription } from "../AudioDescription";
27
28
  import { PlayerImageBackground } from "@applicaster/zapp-react-native-ui-components/Components/PlayerImageBackground";
28
29
  import { useLanguageData } from "@applicaster/zapp-react-native-utils/reactHooks/player";
29
30
  import { PlayNextData } from "@applicaster/zapp-react-native-ui-components/Components/PlayerContainer/PlayerContainer";
30
- import { useEffect, useMemo, useState } from "react";
31
31
  import {
32
- useModalAnimationContext,
33
32
  AnimationComponent,
34
33
  ComponentAnimationType,
34
+ useModalAnimationContext,
35
35
  } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
36
36
  import DockedLayout from "./DockedLayout";
37
37
  import { isValidDate } from "../../Utils";
@@ -79,6 +79,8 @@ type LayoutProps = {
79
79
  defaultDimensions: Dimensions;
80
80
  };
81
81
 
82
+ const { width: SCREEN_WIDTH } = ScreenDimensions.get("screen");
83
+
82
84
  const Styles = {
83
85
  container: { flex: 1 },
84
86
  tabletContainer: (isPortraitMode: boolean) => ({
@@ -91,6 +93,11 @@ const Styles = {
91
93
  maxHeight: 750,
92
94
  marginTop: 80,
93
95
  },
96
+ playerInfoWrapper: {
97
+ flex: 1,
98
+ alignItems: "center",
99
+ justifyContent: "space-between",
100
+ },
94
101
  tabletLayout: {
95
102
  width: 463,
96
103
  marginBottom: 80,
@@ -101,9 +108,9 @@ const Styles = {
101
108
  justifyContent: isLiveShowFullControls ? "space-between" : "space-evenly",
102
109
  }),
103
110
  backgroundImageContainer: (dimensions: Dimensions, isTablet: boolean) => {
104
- const mobileValue = dimensions.width
111
+ const mobileValue = dimensions?.width
105
112
  ? dimensions.width - PADDING_HORIZONTAL * 2
106
- : 330;
113
+ : SCREEN_WIDTH - PADDING_HORIZONTAL * 2;
107
114
 
108
115
  return {
109
116
  width: isTablet ? 463 : mobileValue,
@@ -329,9 +336,7 @@ export default function DefaultLayout(props: LayoutProps) {
329
336
  const Separator = () => <View style={Styles.separator} />;
330
337
 
331
338
  const defaultImageDimensions = React.useMemo(
332
- () =>
333
- defaultDimensions &&
334
- Styles.backgroundImageContainer(defaultDimensions, isTablet),
339
+ () => Styles.backgroundImageContainer(defaultDimensions, isTablet),
335
340
  [defaultDimensions, isTablet]
336
341
  );
337
342
 
@@ -344,7 +349,10 @@ export default function DefaultLayout(props: LayoutProps) {
344
349
  isTablet ? Styles.tabletContainer(isPortraitMode) : Styles.container
345
350
  }
346
351
  >
347
- <AnimationComponent animationType={ComponentAnimationType.componentFade}>
352
+ <AnimationComponent
353
+ animationType={ComponentAnimationType.componentFade}
354
+ style={isTablet ? Styles.playerInfoWrapper : undefined}
355
+ >
348
356
  <TransportInfo
349
357
  content={entry}
350
358
  value={value}
@@ -405,9 +413,10 @@ export default function DefaultLayout(props: LayoutProps) {
405
413
  layoutState={layoutState}
406
414
  />
407
415
  <Separator />
408
- {needsToShowProgressBar && (
416
+ {needsToShowProgressBar ? (
409
417
  <View>
410
418
  <ProgressBar
419
+ name={"audio-default-layout"}
411
420
  content={entry}
412
421
  value={value}
413
422
  visible={true}
@@ -422,17 +431,17 @@ export default function DefaultLayout(props: LayoutProps) {
422
431
  onSkipLive={onSkipLive}
423
432
  />
424
433
 
425
- {showCounter && timeLeft >= 0 && (
434
+ {showCounter && timeLeft >= 0 ? (
426
435
  <CountDown
427
436
  timeLeft={timeLeft}
428
437
  value={value}
429
438
  title={sleepTitle}
430
439
  />
431
- )}
440
+ ) : null}
432
441
 
433
442
  <Separator />
434
443
  </View>
435
- )}
444
+ ) : null}
436
445
  <Controls
437
446
  value={value}
438
447
  visible={true}
@@ -9,18 +9,18 @@ import * as R from "ramda";
9
9
  import { useIsTablet } from "@applicaster/zapp-react-native-utils/reactHooks";
10
10
 
11
11
  import {
12
+ Button,
12
13
  ContentInfo,
13
- ProgressBar,
14
14
  Controls,
15
- Button,
15
+ ProgressBar,
16
16
  } from "@applicaster/quick-brick-mobile-transport-controls";
17
17
 
18
18
  import { PlayNextData } from "@applicaster/zapp-react-native-ui-components/Components/PlayerContainer/PlayerContainer";
19
19
  import {
20
- useModalAnimationContext,
21
20
  AnimationComponent,
22
21
  ComponentAnimationType,
23
22
  PlayerAnimationStateEnum,
23
+ useModalAnimationContext,
24
24
  } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
25
25
 
26
26
  type Dimensions = {
@@ -245,18 +245,19 @@ export default function DockedLayout(props: LayoutProps) {
245
245
  ]}
246
246
  >
247
247
  {!playerState.isLive &&
248
- (layoutState.docked || startComponentsAnimation) && (
249
- <ProgressBar
250
- content={entry}
251
- value={value}
252
- visible={visible}
253
- layoutState={layoutState}
254
- onPlayerSeek={onPlayerSeek}
255
- playerState={playerState}
256
- startComponentsAnimation={startComponentsAnimation}
257
- docked
258
- />
259
- )}
248
+ (layoutState.docked || startComponentsAnimation) ? (
249
+ <ProgressBar
250
+ name={"audio-docked-layout"}
251
+ content={entry}
252
+ value={value}
253
+ visible={visible}
254
+ layoutState={layoutState}
255
+ onPlayerSeek={onPlayerSeek}
256
+ playerState={playerState}
257
+ startComponentsAnimation={startComponentsAnimation}
258
+ docked
259
+ />
260
+ ) : null}
260
261
 
261
262
  <View style={styles.content}>
262
263
  <View
@@ -47,7 +47,7 @@ const fetchPaletteAndDominantColor = async (imageUrl: string) => {
47
47
  const dominant = await getDominantColor(imageUrl);
48
48
  const dominantColor = `rgb(${dominant.r}, ${dominant.g}, ${dominant.b})`;
49
49
 
50
- return { gradientColors: colors.slice(0, 2), dominantColor };
50
+ return { gradientColors: colors.slice(0, 2).reverse(), dominantColor };
51
51
  };
52
52
 
53
53
  export const MagicBG: React.FC<MagicBGProps> = ({
@@ -806,7 +806,6 @@ export default class VideoPlayer extends React.Component<
806
806
  nowPlayingEnabled,
807
807
  paused,
808
808
  seek,
809
- rate,
810
809
  textTrackId,
811
810
  liveSeekingEnabled,
812
811
  liveCatchUpEnabled,
@@ -817,7 +816,14 @@ export default class VideoPlayer extends React.Component<
817
816
  accessibilityProps: getAllAccessibilityProps(
818
817
  this.getPluginConfiguration()
819
818
  ),
820
- }; // rate temporary removed, because of bug with subtitles
819
+ };
820
+
821
+ if (!isAppleTV()) {
822
+ // TODO: Move to RN method and remove from props.
823
+ // Causes tvOS bug: native player passes rate on fast seek,
824
+ // RN returns it and it breaks playback.
825
+ nativeProps.rate = rate;
826
+ }
821
827
 
822
828
  if (
823
829
  this.isReactNativeMethodsSupported() &&
@@ -990,14 +996,14 @@ export default class VideoPlayer extends React.Component<
990
996
  const renderMobilePlayer = () => {
991
997
  return isFullScreenAudioPlayer && isAudioItem ? (
992
998
  <View style={containerStyle}>
993
- {(!castAction?.state?.connected || supportNativeCast) && (
999
+ {!castAction?.state?.connected || supportNativeCast ? (
994
1000
  <this.props.PlayerComponent
995
1001
  ref={this._assignRoot}
996
1002
  {...nativeEvents}
997
1003
  {...nativeProps}
998
1004
  listener={this.props.listener}
999
1005
  />
1000
- )}
1006
+ ) : null}
1001
1007
  <AudioPlayerWrapper {...sharedWrapperViewProps} />
1002
1008
  </View>
1003
1009
  ) : (
@@ -1012,7 +1018,7 @@ export default class VideoPlayer extends React.Component<
1012
1018
  return (
1013
1019
  <View style={styles.container}>
1014
1020
  <View style={[playerContainerStyles, playerDimensions]}>
1015
- {isAudioItem && (
1021
+ {isAudioItem ? (
1016
1022
  <AnimationComponent
1017
1023
  animationType={ComponentAnimationType.player}
1018
1024
  additionalData={{
@@ -1031,18 +1037,18 @@ export default class VideoPlayer extends React.Component<
1031
1037
  plugin_configuration={this.getPluginConfiguration()}
1032
1038
  />
1033
1039
  </AnimationComponent>
1034
- )}
1040
+ ) : null}
1035
1041
 
1036
- {shouldRenderBackground && (
1042
+ {shouldRenderBackground ? (
1037
1043
  <PlayerImageBackground
1038
1044
  imageKey={backgroundImageKey}
1039
1045
  configuration={this.getPluginConfiguration()}
1040
1046
  entry={entry}
1041
1047
  style={getBackgroundImageStyle(playerDimensions)}
1042
1048
  />
1043
- )}
1049
+ ) : null}
1044
1050
 
1045
- {(!castAction?.state?.connected || supportNativeCast) && (
1051
+ {!castAction?.state?.connected || supportNativeCast ? (
1046
1052
  <AnimationComponent
1047
1053
  animationType={ComponentAnimationType.player}
1048
1054
  additionalData={playerDimensions}
@@ -1064,7 +1070,7 @@ export default class VideoPlayer extends React.Component<
1064
1070
  {this.childrenWithPlayNext()}
1065
1071
  </this.props.PlayerComponent>
1066
1072
  </AnimationComponent>
1067
- )}
1073
+ ) : null}
1068
1074
  </View>
1069
1075
 
1070
1076
  {renderTransportControls(playerDimensions)}