Webkit support

This commit is contained in:
zisra 2023-02-27 03:43:14 -06:00
parent f2f7925cbb
commit 3fad6edaad
3 changed files with 24 additions and 15 deletions

View File

@ -54,8 +54,3 @@ body[data-no-select] {
.google-cast-button:not(.casting) google-cast-launcher { .google-cast-button:not(.casting) google-cast-launcher {
@apply brightness-[500]; @apply brightness-[500];
} }
:picture-in-picture {
opacity: 0.3;
filter: blur(5px);
}

View File

@ -42,3 +42,7 @@ export function canFullscreen(): boolean {
export function canPictureInPicture(): boolean { export function canPictureInPicture(): boolean {
return "pictureInPictureEnabled" in document; return "pictureInPictureEnabled" in document;
} }
export function canWebkitPictureInPicture(): boolean {
return "webkitSupportsPresentationMode" in document.createElement("video");
}

View File

@ -6,6 +6,7 @@ import {
canFullscreenAnyElement, canFullscreenAnyElement,
canWebkitFullscreen, canWebkitFullscreen,
canPictureInPicture, canPictureInPicture,
canWebkitPictureInPicture,
} from "@/utils/detectFeatures"; } from "@/utils/detectFeatures";
import { MWStreamType } from "@/backend/helpers/streams"; import { MWStreamType } from "@/backend/helpers/streams";
import { updateInterface } from "@/video/state/logic/interface"; import { updateInterface } from "@/video/state/logic/interface";
@ -205,18 +206,27 @@ export function createVideoStateProvider(
updateSource(descriptor, state); updateSource(descriptor, state);
} }
}, },
async togglePictureInPicture() { togglePictureInPicture() {
if (!canPictureInPicture()) return; if (canWebkitPictureInPicture()) {
if (player !== document.pictureInPictureElement) { const webkitPlayer = player as any;
try { webkitPlayer.webkitSetPresentationMode(
await player.requestPictureInPicture(); webkitPlayer.webkitPresentationMode === "picture-in-picture"
} catch { ? "inline"
: "picture-in-picture"
);
}
if (canPictureInPicture()) {
if (player !== document.pictureInPictureElement) {
try {
player.requestPictureInPicture();
} catch {
state.interface.isPictureInPicture = false;
}
state.interface.isPictureInPicture = true;
} else {
document.exitPictureInPicture();
state.interface.isPictureInPicture = false; state.interface.isPictureInPicture = false;
} }
state.interface.isPictureInPicture = true;
} else {
await document.exitPictureInPicture();
state.interface.isPictureInPicture = false;
} }
}, },
providerStart() { providerStart() {