mirror of
https://github.com/aleksilassila/reiverr.git
synced 2026-04-23 17:25:14 +02:00
102 lines
2.9 KiB
TypeScript
102 lines
2.9 KiB
TypeScript
import { writable } from 'svelte/store';
|
|
import { modalStack } from '../Modal/modal.store';
|
|
import { jellyfinItemsStore } from '../../stores/data.store';
|
|
import VideoPlayerModal from './JellyfinVideoPlayerModal.svelte';
|
|
|
|
export type PlaybackInfo = {
|
|
playbackUrl: string;
|
|
directPlay: boolean;
|
|
backdrop?: string;
|
|
startTime?: number;
|
|
};
|
|
|
|
const initialValue = { visible: false, jellyfinId: '' };
|
|
export type PlayerStateValue = typeof initialValue;
|
|
|
|
function createPlayerState() {
|
|
const store = writable<PlayerStateValue>(initialValue);
|
|
|
|
return {
|
|
...store,
|
|
streamJellyfinId: (id: string) => {
|
|
store.set({ visible: true, jellyfinId: id });
|
|
modalStack.create(VideoPlayerModal, { id });
|
|
},
|
|
close: () => {
|
|
store.set({ visible: false, jellyfinId: '' });
|
|
jellyfinItemsStore.send();
|
|
}
|
|
};
|
|
}
|
|
|
|
export const playerState = createPlayerState();
|
|
|
|
export function getBrowserSpecificMediaFunctions() {
|
|
// These functions are different in every browser
|
|
let reqFullscreenFunc: ((elem: HTMLElement) => void) | undefined = undefined;
|
|
let exitFullscreen: (() => void) | undefined = undefined;
|
|
let fullscreenChangeEvent: string | undefined = undefined;
|
|
let getFullscreenElement: (() => HTMLElement) | undefined = undefined;
|
|
|
|
// Find the correct functions
|
|
let elem = document.createElement('div');
|
|
// @ts-expect-error
|
|
if (elem.requestFullscreen) {
|
|
reqFullscreenFunc = (elem) => {
|
|
elem.requestFullscreen();
|
|
};
|
|
fullscreenChangeEvent = 'fullscreenchange';
|
|
getFullscreenElement = () => <HTMLElement>document.fullscreenElement;
|
|
if (document.exitFullscreen) exitFullscreen = () => document.exitFullscreen();
|
|
|
|
// @ts-expect-error
|
|
} else if (elem.webkitRequestFullscreen) {
|
|
reqFullscreenFunc = (elem) => {
|
|
// @ts-expect-error
|
|
elem.webkitRequestFullscreen();
|
|
};
|
|
fullscreenChangeEvent = 'webkitfullscreenchange';
|
|
|
|
// @ts-expect-error
|
|
getFullscreenElement = () => <HTMLElement>document.webkitFullscreenElement;
|
|
|
|
// @ts-expect-error
|
|
if (document.webkitExitFullscreen) exitFullscreen = () => document.webkitExitFullscreen();
|
|
|
|
// @ts-expect-error
|
|
} else if (elem.msRequestFullscreen) {
|
|
reqFullscreenFunc = (elem) => {
|
|
// @ts-expect-error
|
|
elem.msRequestFullscreen();
|
|
};
|
|
fullscreenChangeEvent = 'MSFullscreenChange';
|
|
|
|
// @ts-expect-error
|
|
getFullscreenElement = () => <HTMLElement>document.msFullscreenElement;
|
|
|
|
// @ts-expect-error
|
|
if (document.msExitFullscreen) exitFullscreen = () => document.msExitFullscreen();
|
|
|
|
// @ts-expect-error
|
|
} else if (elem.mozRequestFullScreen) {
|
|
reqFullscreenFunc = (elem) => {
|
|
// @ts-expect-error
|
|
elem.mozRequestFullScreen();
|
|
};
|
|
fullscreenChangeEvent = 'mozfullscreenchange';
|
|
|
|
// @ts-expect-error
|
|
getFullscreenElement = () => <HTMLElement>document.mozFullScreenElement;
|
|
|
|
// @ts-expect-error
|
|
if (document.mozCancelFullScreen) exitFullscreen = () => document.mozCancelFullScreen();
|
|
}
|
|
|
|
return {
|
|
reqFullscreenFunc,
|
|
exitFullscreen,
|
|
fullscreenChangeEvent,
|
|
getFullscreenElement
|
|
};
|
|
}
|