Browse Source

Webkit support

pull/175/head
zisra 2 years ago
parent
commit
3fad6edaad
  1. 5
      src/setup/index.css
  2. 4
      src/utils/detectFeatures.ts
  3. 30
      src/video/state/providers/videoStateProvider.ts

5
src/setup/index.css

@ -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);
}

4
src/utils/detectFeatures.ts

@ -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");
}

30
src/video/state/providers/videoStateProvider.ts

@ -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() {

Loading…
Cancel
Save