@applicaster/quick-brick-player 12.0.0-alpha.3977160850 → 12.0.0-alpha.4400210593

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": "12.0.0-alpha.3977160850",
3
+ "version": "12.0.0-alpha.4400210593",
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": "12.0.0-rc.28",
39
+ "@applicaster/quick-brick-mobile-transport-controls": "12.0.0-rc.33",
40
40
  "@applicaster/quick-brick-tv-transport-controls": "11.0.0-rc.133",
41
- "@applicaster/zapp-react-native-tvos-app": "12.0.0-alpha.3977160850",
42
- "@applicaster/zapp-react-native-ui-components": "12.0.0-alpha.3977160850",
43
- "@applicaster/zapp-react-native-utils": "12.0.0-alpha.3977160850",
41
+ "@applicaster/zapp-react-native-tvos-app": "12.0.0-alpha.4400210593",
42
+ "@applicaster/zapp-react-native-ui-components": "12.0.0-alpha.4400210593",
43
+ "@applicaster/zapp-react-native-utils": "12.0.0-alpha.4400210593",
44
44
  "keymirror": "^0.1.1",
45
45
  "query-string": "7.1.3",
46
46
  "react-native-web-linear-gradient": "1.1.2",
@@ -1,8 +1,9 @@
1
1
  import React, { useEffect, useState } from "react";
2
- import { Image, StyleSheet, View } from "react-native";
2
+ import { StyleSheet, View } from "react-native";
3
3
  import { usePlayer } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayer";
4
4
  import { MUTED_USAGE } from "../const";
5
5
  import { LiveImageManager } from "@applicaster/zapp-react-native-ui-components/Components/VideoLive/LiveImageManager";
6
+ import { QBImage as Image } from "@applicaster/zapp-react-native-ui-components/Components/Image";
6
7
 
7
8
  type Asset = string | undefined;
8
9
 
@@ -24,7 +24,7 @@ import {
24
24
  NAMESPACE,
25
25
  } from "./utils";
26
26
  import { localStorage } from "@applicaster/zapp-react-native-bridge/ZappStorage/LocalStorage";
27
- import { getLiveUrl } from "../Utils";
27
+ import { addQueryParam, getLiveUrl } from "../Utils";
28
28
  import { useTitleSummaryOverlay } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayerTitleSummaryOverlay";
29
29
 
30
30
  const { log_debug } = createLogger({
@@ -144,9 +144,9 @@ export const AudioPlayerWrapper: React.FC<Props> = (props: Props) => {
144
144
  const isTablet = useIsTablet();
145
145
 
146
146
  const isTabletLandscape = !isTV() && isTablet && !isTabletPortrait;
147
-
147
+
148
148
  // TODO: Have generic place for live url from configuration. Currently its hardcoded for client.
149
-
149
+
150
150
  const feedUrl = getLiveUrl(entry?.extensions?.live?.channel_src ?? "");
151
151
 
152
152
  const { title, summary } = useTitleSummaryOverlay(
@@ -195,7 +195,6 @@ export const AudioPlayerWrapper: React.FC<Props> = (props: Props) => {
195
195
  });
196
196
 
197
197
  setSleepTimerDate(0);
198
- player?.pause();
199
198
 
200
199
  await localStorage.removeItem("sleep", NAMESPACE);
201
200
  };
@@ -456,17 +455,20 @@ export const AudioPlayerWrapper: React.FC<Props> = (props: Props) => {
456
455
  if (configuration.magic_background) {
457
456
  const baseUrl = entry?.extensions?.audio_player_background_image ?? "";
458
457
 
459
- // TODO: To be added when background is ready
458
+ const queryParamName =
459
+ configuration.audio_player_background_image_query || "width";
460
+
461
+ const queryParamValue = 15;
460
462
 
461
- // const queryParamName =
462
- // configuration.audio_player_background_image_query || "width";
463
- //
464
- // const queryParamValue = 15;
465
- //
466
- // const url = addQueryParam(baseUrl, queryParamName, queryParamValue);
463
+ const url = addQueryParam(baseUrl, queryParamName, queryParamValue);
467
464
 
468
465
  return (
469
- <MagicBG image={baseUrl} fallbackUrl={baseUrl} defaultColor="#000000">
466
+ <MagicBG
467
+ image={url}
468
+ fallbackUrl={baseUrl}
469
+ colors={entry?.extensions?.backgroundColors}
470
+ defaultColor="#000000"
471
+ >
470
472
  {MainContent}
471
473
  </MagicBG>
472
474
  );
@@ -11,9 +11,10 @@ type MagicBGProps = {
11
11
  image: string;
12
12
  fallbackUrl?: string;
13
13
  defaultColor: string;
14
+ colors: string[]; // Updated to type string[] as it holds hex values
14
15
  };
15
16
 
16
- const colors = {
17
+ const defaultColors = {
17
18
  overlay: "rgba(0, 0, 0, 0.35)",
18
19
  defaultGradientStart: "rgba(0, 0, 0, 0.25)",
19
20
  defaultGradientEnd: "rgba(0, 0, 0, 0)",
@@ -25,7 +26,7 @@ const styles = StyleSheet.create({
25
26
  },
26
27
  fullScreenOverlay: {
27
28
  ...StyleSheet.absoluteFillObject,
28
- backgroundColor: colors.overlay,
29
+ backgroundColor: defaultColors.overlay,
29
30
  },
30
31
  gradientOverlay: {
31
32
  position: "absolute",
@@ -54,46 +55,63 @@ export const MagicBG: React.FC<MagicBGProps> = ({
54
55
  children,
55
56
  image,
56
57
  fallbackUrl = "",
58
+ colors = [],
57
59
  defaultColor,
58
60
  }) => {
59
61
  const [dominantColor, setDominantColor] =
60
62
  React.useState<string>(defaultColor);
61
63
 
62
64
  const [gradientColors, setGradientColors] = React.useState<string[]>([
63
- colors.defaultGradientStart,
64
- colors.defaultGradientEnd,
65
+ defaultColors.defaultGradientStart,
66
+ defaultColors.defaultGradientEnd,
65
67
  ]);
66
68
 
67
69
  useEffect(() => {
68
70
  const fetchColors = async () => {
69
- if (!image) return;
70
-
71
- try {
72
- const { gradientColors, dominantColor } =
73
- await fetchPaletteAndDominantColor(image);
74
-
75
- setGradientColors(gradientColors);
76
- setDominantColor(dominantColor);
77
- } catch (error) {
71
+ // Check if colors are provided and not empty
72
+ if (colors && colors.length > 0) {
73
+ // Use provided colors for gradient and dominant color
74
+ setGradientColors(colors.slice(0, 2)); // First 2 colors for gradient
75
+ setDominantColor(colors[0]); // First color as dominant
76
+ } else if (image) {
77
+ // If no colors, try fetching from image
78
78
  try {
79
79
  const { gradientColors, dominantColor } =
80
- await fetchPaletteAndDominantColor(fallbackUrl);
80
+ await fetchPaletteAndDominantColor(image);
81
81
 
82
82
  setGradientColors(gradientColors);
83
83
  setDominantColor(dominantColor);
84
- } catch {
85
- setGradientColors([
86
- colors.defaultGradientStart,
87
- colors.defaultGradientEnd,
88
- ]);
89
-
90
- setDominantColor(defaultColor);
84
+ } catch (error) {
85
+ // If image fetch fails, try fallback URL
86
+ try {
87
+ const { gradientColors, dominantColor } =
88
+ await fetchPaletteAndDominantColor(fallbackUrl);
89
+
90
+ setGradientColors(gradientColors);
91
+ setDominantColor(dominantColor);
92
+ } catch {
93
+ // If everything fails, use default color
94
+ setGradientColors([
95
+ defaultColors.defaultGradientStart,
96
+ defaultColors.defaultGradientEnd,
97
+ ]);
98
+
99
+ setDominantColor(defaultColor);
100
+ }
91
101
  }
102
+ } else {
103
+ // If no image or colors, use default color
104
+ setGradientColors([
105
+ defaultColors.defaultGradientStart,
106
+ defaultColors.defaultGradientEnd,
107
+ ]);
108
+
109
+ setDominantColor(defaultColor);
92
110
  }
93
111
  };
94
112
 
95
113
  fetchColors();
96
- }, [image, fallbackUrl, colors, defaultColor]);
114
+ }, []);
97
115
 
98
116
  return (
99
117
  <View style={[styles.container, { backgroundColor: dominantColor }]}>
@@ -36,6 +36,8 @@ import { AudioPlayerWrapper } from "./AudioLayer/AudioPlayerWrapper";
36
36
  import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils";
37
37
  import { getAllAccessibilityProps } from "@applicaster/zapp-react-native-utils/configurationUtils";
38
38
  import { PlayNextData } from "@applicaster/zapp-react-native-ui-components/Components/PlayerContainer/PlayerContainer";
39
+ import { getTargetScreenDataFromEntry } from "@applicaster/zapp-react-native-utils/reactHooks/screen/useTargetScreenData";
40
+ import { isAppleTV } from "@applicaster/zapp-react-native-ui-components/Helpers/Platform";
39
41
 
40
42
  const RNPlayerManager = {
41
43
  QuickBrickPlayerPlugin: isApplePlatform()
@@ -555,6 +557,26 @@ export default class VideoPlayer extends React.Component<
555
557
  this.props.listener?.onPlayerDetached?.(nativeEvent);
556
558
  };
557
559
 
560
+ onVideoFullscreenPlayerDidDismiss = () => {
561
+ this.props.listener?.onVideoFullscreenPlayerDidDismiss?.();
562
+ };
563
+
564
+ onVideoFullscreenPlayerDidPresent = () => {
565
+ this.props.listener?.onVideoFullscreenPlayerDidPresent?.();
566
+ };
567
+
568
+ onVideoFullscreenPlayerWillDismiss = () => {
569
+ this.props.listener?.onVideoFullscreenPlayerWillDismiss?.();
570
+ };
571
+
572
+ onVideoFullscreenPlayerWillPresent = () => {
573
+ this.props.listener?.onVideoFullscreenPlayerWillPresent?.();
574
+ };
575
+
576
+ onPlayerClose = () => {
577
+ this.props.listener?.onPlayerClose?.();
578
+ };
579
+
558
580
  onPiPEnter = () => {
559
581
  this.setState({ piped: true });
560
582
  this.props.openPiP();
@@ -759,7 +781,6 @@ export default class VideoPlayer extends React.Component<
759
781
  render() {
760
782
  const {
761
783
  castAction,
762
- controls,
763
784
  docked,
764
785
  entry,
765
786
  fullscreen,
@@ -817,17 +838,31 @@ export default class VideoPlayer extends React.Component<
817
838
  const liveCatchUpEnabled =
818
839
  this.props.pluginConfiguration?.liveCatchUpEnabled;
819
840
 
820
- const hideNativeControls = isTV()
821
- ? { controls: !this.getPlayNextData() }
822
- : {};
841
+ // TODO: Get screen data more reliable way useCurrentScreenData
842
+ const screenData = getTargetScreenDataFromEntry(this.props.playableItem);
823
843
 
824
- const platformSpecificProps = isApplePlatform()
844
+ const isInlineTV = screenData?.ui_components?.length > 0 && isTV();
845
+
846
+ let platformSpecificProps: any = isApplePlatform()
825
847
  ? {
826
- ...hideNativeControls,
827
848
  resizeMode: nativeResizeMode,
828
849
  }
829
850
  : {};
830
851
 
852
+ const supportsNativeControls =
853
+ !!this.props.controller?.supportsNativeControls?.();
854
+
855
+ const controls = isAppleTV()
856
+ ? supportsNativeControls && !isInlineTV && !this.getPlayNextData()
857
+ : supportsNativeControls && !this.getPlayNextData();
858
+
859
+ const shouldUseNativeControls = controls && !docked;
860
+
861
+ platformSpecificProps = {
862
+ ...platformSpecificProps,
863
+ controls: shouldUseNativeControls,
864
+ };
865
+
831
866
  const pictureInPictureEnabled =
832
867
  this.props.pluginConfiguration?.pictureInPictureEnabled;
833
868
 
@@ -835,7 +870,6 @@ export default class VideoPlayer extends React.Component<
835
870
  entry, // Must be passed first in list
836
871
  ...platformSpecificProps,
837
872
  audioTrackId,
838
- controls,
839
873
  docked,
840
874
  enableAutoAudioTrackSelection,
841
875
  fullscreen, // TODO: Check fullscreen params not crash
@@ -890,22 +924,17 @@ export default class VideoPlayer extends React.Component<
890
924
  onVideoEnd: this.onVideoEnd, // complete
891
925
  onVideoError: this.onVideoError, // error
892
926
  onVideoProgress: this.onVideoProgress,
893
- onVideoFullscreenPlayerDidDismiss: this.unHandledEvent(
894
- "onVideoFullscreenPlayerDidPresent"
895
- ),
896
- onVideoFullscreenPlayerDidPresent: this.unHandledEvent(
897
- "onVideoFullscreenPlayerDidPresent"
898
- ),
899
- onVideoFullscreenPlayerWillDismiss: this.unHandledEvent(
900
- "onVideoFullscreenPlayerWillDismiss"
901
- ),
902
- onVideoFullscreenPlayerWillPresent: this.unHandledEvent(
903
- "onVideoFullscreenPlayerWillPresent"
904
- ),
927
+ onVideoFullscreenPlayerDidDismiss: this.onVideoFullscreenPlayerDidDismiss,
928
+ onVideoFullscreenPlayerDidPresent: this.onVideoFullscreenPlayerDidPresent,
929
+ onVideoFullscreenPlayerWillDismiss:
930
+ this.onVideoFullscreenPlayerWillDismiss,
931
+ onVideoFullscreenPlayerWillPresent:
932
+ this.onVideoFullscreenPlayerWillPresent,
905
933
  onVideoLoad: this.onVideoLoad,
906
934
  onVideoLoadStart: this.unHandledEvent("onVideoLoadStart"),
907
935
  onVideoBuffer: this.onVideoBuffer,
908
936
  onPlaybackStalled: this.onPlaybackStalled,
937
+ onPlayerClose: this.onPlayerClose,
909
938
  onPlayerAttached: this.onPlayerAttached,
910
939
  onPlayerDetached: this.onPlayerDetached,
911
940
  };
@@ -979,7 +1008,7 @@ export default class VideoPlayer extends React.Component<
979
1008
  !needToShowPlayNextOverlay &&
980
1009
  this.props.mode !== "PIP";
981
1010
 
982
- if (controls === true) {
1011
+ if (shouldUseNativeControls) {
983
1012
  return null;
984
1013
  }
985
1014