@applicaster/quick-brick-player 12.0.0-rc.34 → 12.0.0-rc.36
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-rc.
|
|
3
|
+
"version": "12.0.0-rc.36",
|
|
4
4
|
"description": "Quick Brick Player",
|
|
5
5
|
"main": "./src/index.ts",
|
|
6
6
|
"types": "index.d.ts",
|
|
@@ -38,9 +38,9 @@
|
|
|
38
38
|
"dependencies": {
|
|
39
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-rc.
|
|
42
|
-
"@applicaster/zapp-react-native-ui-components": "12.0.0-rc.
|
|
43
|
-
"@applicaster/zapp-react-native-utils": "12.0.0-rc.
|
|
41
|
+
"@applicaster/zapp-react-native-tvos-app": "12.0.0-rc.36",
|
|
42
|
+
"@applicaster/zapp-react-native-ui-components": "12.0.0-rc.36",
|
|
43
|
+
"@applicaster/zapp-react-native-utils": "12.0.0-rc.36",
|
|
44
44
|
"keymirror": "^0.1.1",
|
|
45
45
|
"query-string": "7.1.3",
|
|
46
46
|
"react-native-web-linear-gradient": "1.1.2",
|
|
@@ -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({
|
|
@@ -455,17 +455,20 @@ export const AudioPlayerWrapper: React.FC<Props> = (props: Props) => {
|
|
|
455
455
|
if (configuration.magic_background) {
|
|
456
456
|
const baseUrl = entry?.extensions?.audio_player_background_image ?? "";
|
|
457
457
|
|
|
458
|
-
|
|
458
|
+
const queryParamName =
|
|
459
|
+
configuration.audio_player_background_image_query || "width";
|
|
459
460
|
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
// const queryParamValue = 15;
|
|
464
|
-
//
|
|
465
|
-
// const url = addQueryParam(baseUrl, queryParamName, queryParamValue);
|
|
461
|
+
const queryParamValue = 15;
|
|
462
|
+
|
|
463
|
+
const url = addQueryParam(baseUrl, queryParamName, queryParamValue);
|
|
466
464
|
|
|
467
465
|
return (
|
|
468
|
-
<MagicBG
|
|
466
|
+
<MagicBG
|
|
467
|
+
image={url}
|
|
468
|
+
fallbackUrl={baseUrl}
|
|
469
|
+
colors={entry?.extensions?.backgroundColors}
|
|
470
|
+
defaultColor="#000000"
|
|
471
|
+
>
|
|
469
472
|
{MainContent}
|
|
470
473
|
</MagicBG>
|
|
471
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
|
|
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:
|
|
29
|
+
backgroundColor: defaultColors.overlay,
|
|
29
30
|
},
|
|
30
31
|
gradientOverlay: {
|
|
31
32
|
position: "absolute",
|
|
@@ -54,41 +55,58 @@ 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
|
-
|
|
64
|
-
|
|
65
|
+
defaultColors.defaultGradientStart,
|
|
66
|
+
defaultColors.defaultGradientEnd,
|
|
65
67
|
]);
|
|
66
68
|
|
|
67
69
|
useEffect(() => {
|
|
68
70
|
const fetchColors = async () => {
|
|
69
|
-
if
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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(
|
|
80
|
+
await fetchPaletteAndDominantColor(image);
|
|
81
81
|
|
|
82
82
|
setGradientColors(gradientColors);
|
|
83
83
|
setDominantColor(dominantColor);
|
|
84
|
-
} catch {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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
|
|
package/src/Player/index.tsx
CHANGED
|
@@ -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
|
-
|
|
821
|
-
|
|
822
|
-
: {};
|
|
841
|
+
// TODO: Get screen data more reliable way useCurrentScreenData
|
|
842
|
+
const screenData = getTargetScreenDataFromEntry(this.props.playableItem);
|
|
823
843
|
|
|
824
|
-
const
|
|
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.
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
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 (
|
|
1011
|
+
if (shouldUseNativeControls) {
|
|
983
1012
|
return null;
|
|
984
1013
|
}
|
|
985
1014
|
|