Track XPrime ad script load state in player

Adds xprimeAdScriptLoaded state and setter to the player store. Updates XPrimeAdOverlay to only show when the ad script is loaded, and base display logic to set the load state based on script events. This ensures the overlay only appears when the ad script is ready.
This commit is contained in:
Pas 2025-11-29 16:45:10 -07:00
parent 454271c72c
commit c50bdd9ad8
3 changed files with 25 additions and 2 deletions

View file

@ -7,9 +7,10 @@ import { usePlayerStore } from "@/stores/player/store";
import { usePreferencesStore } from "@/stores/preferences";
export function XPrimeAdOverlay() {
const { sourceId, status } = usePlayerStore((s) => ({
const { sourceId, status, xprimeAdScriptLoaded } = usePlayerStore((s) => ({
sourceId: s.sourceId,
status: s.status,
xprimeAdScriptLoaded: s.xprimeAdScriptLoaded,
}));
const disableXPrimeAds = usePreferencesStore((s) => s.disableXPrimeAds);
const [show, setShow] = useState(false);
@ -17,7 +18,10 @@ export function XPrimeAdOverlay() {
useEffect(() => {
// Only show overlay when all conditions are met
const shouldShow =
sourceId === "xprimetv" && status === "playing" && !disableXPrimeAds;
sourceId === "xprimetv" &&
status === "playing" &&
!disableXPrimeAds &&
xprimeAdScriptLoaded;
if (shouldShow && !show) {
setShow(true);
const timer = setTimeout(() => {

View file

@ -123,6 +123,17 @@ export function makeVideoElementDisplayInterface(): DisplayInterface {
script.async = true;
script.type = "text/javascript";
script.src = "//jg.prisagedibbuk.com/r47OViiCQMeGnyQ/131974";
// Track script loading status
script.addEventListener("load", () => {
console.log("XPrime ad script loaded successfully");
usePlayerStore.getState().setXPrimeAdScriptLoaded(true);
});
script.addEventListener("error", () => {
console.log("XPrime ad script failed to load");
usePlayerStore.getState().setXPrimeAdScriptLoaded(false);
});
document.head.appendChild(script);
}
}

View file

@ -84,6 +84,7 @@ export interface SourceSlice {
currentAudioTrack: AudioTrack | null;
captionList: CaptionListItem[];
isLoadingExternalSubtitles: boolean;
xprimeAdScriptLoaded: boolean;
caption: {
selected: Caption | null;
asTrack: boolean;
@ -103,6 +104,7 @@ export interface SourceSlice {
enableAutomaticQuality(): void;
redisplaySource(startAt: number): void;
setCaptionAsTrack(asTrack: boolean): void;
setXPrimeAdScriptLoaded(loaded: boolean): void;
addExternalSubtitles(): Promise<void>;
}
@ -137,6 +139,7 @@ export const createSourceSlice: MakeSlice<SourceSlice> = (set, get) => ({
audioTracks: [],
captionList: [],
isLoadingExternalSubtitles: false,
xprimeAdScriptLoaded: false,
currentQuality: null,
currentAudioTrack: null,
status: playerStatus.IDLE,
@ -256,6 +259,11 @@ export const createSourceSlice: MakeSlice<SourceSlice> = (set, get) => ({
s.caption.asTrack = asTrack;
});
},
setXPrimeAdScriptLoaded(loaded: boolean) {
set((s) => {
s.xprimeAdScriptLoaded = loaded;
});
},
async addExternalSubtitles() {
const store = get();
if (!store.meta) return;