Skip to content

Commit a1005fb

Browse files
ronalduQualabsluwes
authored andcommitted
feat: add adblocker bypass option, expose player props, and conditional captions menu (#1127)
This PR introduces the following improvements: • New `allowPlaybackWithAdBlocker` prop Allows the player to continue playback even when an adblocker is detected. • If false (default): shows a blocking popup when an adblocker is present. • If true: bypasses the restriction and allows normal playback. • Exposes underlying player props on MuxNewsPlayer Enables more granular configuration and control over the embedded player through MuxNewsPlayer. • Conditional captions menu Adds a captions menu that appears only when text tracks are available. • Allows users to disable captions if they prefer not to see them.
1 parent 374e98a commit a1005fb

File tree

11 files changed

+76
-19
lines changed

11 files changed

+76
-19
lines changed

examples/nextjs-with-typescript/pages/MuxPlayerAds.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ function MuxPlayerAdsPage() {
6666
video_title: "Elephants Dream",
6767
viewer_user_id: "user-id-6789",
6868
}}
69+
// allow playback with ad blocker
70+
allowAdBlocker={true}
6971
streamType="on-demand"
7072
// envKey="mux-data-env-key"
7173
autoPlay={autoplay}

examples/nextjs-with-typescript/pages/mux-video-ads-react.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ function MuxVideoPage() {
4747
setSdkLoaded(true); // Mark SDK as loaded
4848
console.log("Google IMA SDK loaded");
4949
};
50+
script.onerror = () => {
51+
setSdkLoaded(true);
52+
};
5053
document.head.appendChild(script);
5154
};
5255

@@ -75,6 +78,8 @@ function MuxVideoPage() {
7578
ref={mediaElRef}
7679
playbackId="23s11nz72DsoN657h4314PjKKjsF2JG33eBQQt6B95I"
7780
controls
81+
// allow playback with ad blocker
82+
allowAdBlocker={true}
7883
autoplay={autoplay}
7984
muted={muted}
8085
playsInline={true}

examples/nextjs-with-typescript/pages/playlist-page.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ function MuxVideoPage() {
1616
setSdkLoaded(true); // Mark SDK as loaded
1717
console.log("Google IMA SDK loaded");
1818
};
19+
script.onerror = () => {
20+
setSdkLoaded(true);
21+
};
1922
document.head.appendChild(script);
2023
};
2124

@@ -58,11 +61,15 @@ function MuxVideoPage() {
5861
return (
5962
<>
6063
<Head>
61-
<title>&lt;Playlist/&gt; Demo</title>
64+
<title>&lt;Playlist/&gt; Demo 3</title>
6265
</Head>
6366

64-
{sdkLoaded && <MuxNewsPlayer videoList={relatedVideos} />}
65-
67+
{sdkLoaded &&
68+
<MuxNewsPlayer
69+
// allow playback with ad blocker
70+
allowAdBlocker={true}
71+
videoList={relatedVideos}
72+
/>}
6673
</>
6774
);
6875
}

packages/mux-player-react/src/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ type MuxMediaPropTypes = {
7171
};
7272

7373
export type MuxPlayerProps = {
74+
allowAdBlocker?: boolean;
7475
className?: string;
7576
hotkeys?: string;
7677
nohotkeys?: boolean;

packages/mux-player-react/src/news/README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ export default function YourComponent() {
6464
setSdkLoaded(true);
6565
console.log("Google IMA SDK loaded");
6666
};
67+
script.onerror = () => {
68+
setSdkLoaded(true);
69+
};
6770
document.head.appendChild(script);
6871
};
6972

@@ -143,6 +146,9 @@ export default function VideoMuxNewsPlayerPage() {
143146
setSdkLoaded(true);
144147
console.log("Google IMA SDK loaded");
145148
};
149+
script.onerror = () => {
150+
setSdkLoaded(true);
151+
};
146152
document.head.appendChild(script);
147153
};
148154

packages/mux-player-react/src/news/index.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
/// <reference types="google_interactive_media_ads_types" preserve="true"/>
33
import React, { useRef, useState } from 'react';
44
import '@mux/mux-video/ads';
5+
import type { MuxPlayerProps } from '@mux/mux-player-react';
6+
import '@mux/mux-video-ads';
57
import MuxPlayer from '@mux/mux-player-react';
68
import NewsTheme from '../themes/news-theme';
79
import PlaylistEndScreen from './playlist-end-screen';
@@ -15,11 +17,12 @@ export interface VideoItem {
1517

1618
export type PlaylistVideos = VideoItem[];
1719

18-
export interface PlaylistProps {
20+
export interface PlaylistProps extends Omit<MuxPlayerProps, 'playbackId' | 'adTagUrl'> {
1921
videoList: PlaylistVideos;
22+
allowAdBlocker?: boolean;
2023
}
2124

22-
const MuxNewsPlayer = ({ videoList, ...props }: PlaylistProps) => {
25+
const MuxNewsPlayer = ({ allowAdBlocker, videoList, ...props }: PlaylistProps) => {
2326
const mediaElRef = useRef<any>(null);
2427
const [currentIndex, setCurrentIndex] = useState(0);
2528
const [isEndScreenVisible, setIsEndScreenVisible] = useState(false);
@@ -45,6 +48,8 @@ const MuxNewsPlayer = ({ videoList, ...props }: PlaylistProps) => {
4548
<div>
4649
<NewsTheme />
4750
<MuxPlayer
51+
{...props}
52+
allowAdBlocker={allowAdBlocker}
4853
ref={mediaElRef}
4954
theme="news-theme"
5055
key={`player-${playerKey}`}

packages/mux-player-react/src/themes/news-theme.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ export default function NewsTheme() {
102102
103103
<!-- Rendition Menu -->
104104
<style>
105-
media-rendition-menu {
105+
media-rendition-menu, media-captions-menu {
106106
position: absolute;
107107
border-radius: 0.3rem;
108108
right: 12px;
@@ -149,7 +149,7 @@ export default function NewsTheme() {
149149
150150
<media-rendition-menu anchor="auto" hidden>
151151
</media-rendition-menu>
152-
152+
<media-captions-menu hidden anchor="auto"></media-captions-menu>
153153
<!-- Time Range / Progress Bar -->
154154
155155
<style>
@@ -496,6 +496,7 @@ export default function NewsTheme() {
496496
</svg>
497497
498498
</media-rendition-menu-button>
499+
<media-captions-menu-button></media-captions-menu-button>
499500
</template>
500501
501502
<!-- Fullscreen Button -->
@@ -584,7 +585,6 @@ export default function NewsTheme() {
584585
</g>
585586
</svg>
586587
</media-fullscreen-button>
587-
588588
</media-control-bar>`,
589589
}}
590590
/>

packages/mux-player/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ function getProps(el: MuxPlayerElement, state?: any): MuxTemplateProps {
186186
// NOTE: since the attribute value is used as the "source of truth" for the property getter,
187187
// moving this below the `...state` spread so it resolves to the default value when unset (CJP)
188188
extraSourceParams: el.extraSourceParams,
189+
allowAdBlocker: el.getAttribute('allow-ad-blocker'),
189190
};
190191

191192
return props;
@@ -342,6 +343,7 @@ class MuxPlayerElement extends VideoApiElement implements MuxPlayerElement {
342343
if (!isFocusedElementInPlayer) event.preventDefault();
343344
},
344345
};
346+
allowAdBlocker: any;
345347

346348
static get NAME() {
347349
return playerSoftwareName;

packages/mux-player/src/template.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ export const content = (props: MuxTemplateProps) => html`
136136
cast-receiver="${props.castReceiver ?? false}"
137137
drm-token="${props.tokens?.drm ?? false}"
138138
ad-tag-url="${props.adTagUrl ?? false}"
139+
allow-ad-blocker="${props.allowAdBlocker ?? false}"
139140
exportparts="video"
140141
>
141142
${props.storyboard

packages/mux-player/src/types.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ export type MuxTemplateProps = Partial<MuxPlayerProps> & {
5959
proudlyDisplayMuxBadge?: boolean;
6060
adTagUrl: string | undefined;
6161
adBreak: boolean;
62+
allowAdBlocker?: boolean;
6263
};
6364

6465
export type DialogOptions = {

0 commit comments

Comments
 (0)