Started TV route

This commit is contained in:
ward
2025-06-23 11:51:03 +12:00
parent f967ae48cb
commit 9ff9bfbaf1
4 changed files with 40 additions and 18 deletions
+9 -17
View File
@@ -25,6 +25,7 @@
authStore,
darkModeStore,
instanceStore,
isAndroidTvStore,
playerAndroidLockOrientation,
playerAutoplayNextByDefaultStore,
playerAutoPlayStore,
@@ -50,7 +51,6 @@
import { patchYoutubeJs } from '$lib/patches/youtubejs';
import { playbackRates } from '$lib/const';
import { EndTimeElement } from '$lib/shaka-elements/endTime';
import androidTv from '$lib/android/plugins/androidTv';
import { loadEntirePlaylist } from '$lib/playlist';
import { goto } from '$app/navigation';
import { unsafeRandomItem } from '$lib/misc';
@@ -72,12 +72,10 @@
}: Props = $props();
let snackBarAlert = $state('');
let playerPosSet = false;
let originalOrigination: ScreenOrientationResult | undefined;
let watchProgressTimeout: NodeJS.Timeout;
let playerElementResizeObserver: ResizeObserver | undefined;
let showVideoRetry = $state(false);
let isAndroidTv = $state(false);
let player: shaka.Player;
let shakaUi: shaka.ui.Overlay;
@@ -200,7 +198,7 @@
if (
Capacitor.getPlatform() === 'android' &&
data.video.adaptiveFormats.length > 0 &&
!isAndroidTv
!$isAndroidTvStore
) {
const videoFormats = data.video.adaptiveFormats.filter((format) =>
format.type.startsWith('video/')
@@ -413,8 +411,6 @@
return;
}
isAndroidTv = (await androidTv.isAndroidTv()).value;
HttpFetchPlugin.cacheManager.clearCache();
player = new shaka.Player();
@@ -586,7 +582,7 @@
setChapterMarkers();
if (isAndroidTv) {
if ($isAndroidTvStore) {
Mousetrap.bind('enter', () => {
if (playerElement?.paused) {
playerElement?.play();
@@ -660,9 +656,6 @@
});
async function loadPlayerPos() {
if (playerPosSet) return;
playerPosSet = true;
if (loadTimeFromUrl($page)) return;
let toSetTime = 0;
@@ -686,11 +679,11 @@
}
function savePlayerPos() {
if (data.video.hlsUrl) return;
if (data.video.liveNow) return;
const synciousEnabled = $synciousStore && $synciousInstanceStore && $authStore;
if ($playerSavePlaybackPositionStore && player && playerElement && playerElement.currentTime) {
if ($playerSavePlaybackPositionStore && playerElement) {
if (
playerElement.currentTime < playerElement.duration - 10 &&
playerElement.currentTime > 10
@@ -715,7 +708,7 @@
}
onDestroy(async () => {
if (Capacitor.getPlatform() === 'android') {
if (Capacitor.getPlatform() === 'android' && !$isAndroidTvStore) {
if (originalOrigination) {
await StatusBar.setOverlaysWebView({ overlay: false });
await StatusBar.show();
@@ -725,7 +718,7 @@
}
}
Mousetrap.unbind(['enter', 'left', 'right']);
Mousetrap.unbind(['enter', 'left', 'right', 'space', 'c', 'f', 'shift+left', 'shift+right']);
if (watchProgressTimeout) {
clearTimeout(watchProgressTimeout);
@@ -735,7 +728,6 @@
savePlayerPos();
} catch (error) {}
playerPosSet = false;
HttpFetchPlugin.cacheManager.clearCache();
if (playerElementResizeObserver) {
@@ -760,8 +752,8 @@
<div
id="shaka-container"
class="player-theme"
class:contain-video={!isAndroidTv}
class:tv-contain-video={isAndroidTv}
class:contain-video={!$isAndroidTvStore}
class:tv-contain-video={$isAndroidTvStore}
data-shaka-player-container
class:hide={showVideoRetry}
>
@@ -1,5 +1,4 @@
<script lang="ts">
import { getPlaylist } from '$lib/api/index';
import type { PlaylistPageVideo } from '$lib/api/model';
import VideoList from '$lib/components/VideoList.svelte';
import { unsafeRandomItem } from '$lib/misc';
@@ -0,0 +1,22 @@
import { getVideo } from '$lib/api/index';
import { playerProxyVideosStore } from '$lib/store';
import { error } from '@sveltejs/kit';
import { get } from 'svelte/store';
export async function load({ params }) {
let video;
try {
video = await getVideo(params.slug, get(playerProxyVideosStore));
} catch (errorMessage: any) {
error(500, errorMessage);
}
return {
video: video,
content: {
description: '',
timestamps: []
},
playlistId: null
};
}
@@ -0,0 +1,9 @@
<script lang="ts">
import Player from '$lib/components/Player.svelte';
let { data } = $props();
let playerElement: HTMLMediaElement;
</script>
<Player bind:playerElement isEmbed={true} {data} />