Fix playerElement not being set

This commit is contained in:
WardPearce
2025-11-07 16:15:50 +13:00
parent fc0dec833b
commit 1f44b74480
3 changed files with 56 additions and 46 deletions
@@ -32,6 +32,7 @@
playerDefaultQualityStore,
playerProxyVideosStore,
playerSavePlaybackPositionStore,
playerState,
playerStatisticsByDefault,
playerYouTubeJsFallback,
sponsorBlockCategoriesStore,
@@ -458,6 +459,10 @@
});
playerElement = document.getElementById('player') as HTMLMediaElement;
if ($playerState) {
playerState.set({ ...$playerState, playerElement: playerElement });
}
// Due to how our player is rendered in layout for stateful pip
// we calaculate player height to then allow children pages
// to wrap around it.
+1 -12
View File
@@ -259,17 +259,6 @@
});
let webManifestLink = $derived(pwaInfo ? pwaInfo.webManifest.linkTag : '');
let playerElement: HTMLMediaElement | undefined = $state();
let playerElementCaught = false;
$effect(() => {
if ($playerState && playerElement && !playerElementCaught) {
playerElementCaught = true;
playerState.set({ ...$playerState, playerElement: playerElement });
}
});
</script>
<svelte:head>
@@ -423,7 +412,7 @@
<div class="space"></div>
{/if}
{#key $playerState.data.video.videoId}
<Player data={$playerState.data} isSyncing={$playerState.isSyncing} {playerElement} />
<Player data={$playerState.data} isSyncing={$playerState.isSyncing} />
{/key}
{#if playerIsPip}
<nav>
@@ -74,10 +74,6 @@
isSyncing: $syncPartyPeerStore !== null
});
playerState.subscribe((updatedPlayerState) => {
playerElement = updatedPlayerState?.playerElement;
});
$effect(() => {
if ($interfaceAutoExpandComments && comments) {
expandSummery('comment-section');
@@ -223,41 +219,52 @@
playerSyncEvents(connections[connections.length - 1]);
});
onMount(async () => {
if (data.playlistId) {
await goToCurrentPlaylistItem();
playerPlaylistHistory.set([data.video.videoId, ...$playerPlaylistHistory]);
}
onMount(() => {
// Required due to needing the playerElement
let loadedPlayer = false;
playerState.subscribe(async (updatedPlayerState) => {
if (!updatedPlayerState?.playerElement || loadedPlayer) {
return;
}
loadedPlayer = true;
if ($interfaceAutoExpandChapters) {
expandSummery('chapter-section');
}
playerElement = updatedPlayerState.playerElement;
if ($syncPartyConnectionsStore) {
$syncPartyConnectionsStore.forEach((conn) => {
playerSyncEvents(conn);
});
}
if (data.playlistId) {
await goToCurrentPlaylistItem();
playerPlaylistHistory.set([data.video.videoId, ...$playerPlaylistHistory]);
}
if (playerElement) {
playerElement.addEventListener('timeupdate', () => {
if (!playerElement) return;
playerCurrentTime = playerElement.currentTime;
});
}
if ($interfaceAutoExpandChapters) {
expandSummery('chapter-section');
}
if (data.video.premiereTimestamp) {
premiereTime = humanFriendlyTimestamp(data.video.premiereTimestamp);
premiereUpdateInterval = setInterval(async () => {
data = await getWatchDetails(data.video.videoId, page.url);
if ($syncPartyConnectionsStore) {
$syncPartyConnectionsStore.forEach((conn) => {
playerSyncEvents(conn);
});
}
if (data.video.premiereTimestamp) {
premiereTime = humanFriendlyTimestamp(data.video.premiereTimestamp);
} else {
clearInterval(premiereUpdateInterval);
}
}, 60000);
}
if (playerElement) {
playerElement.addEventListener('timeupdate', () => {
if (!playerElement) return;
playerCurrentTime = playerElement.currentTime;
});
}
if (data.video.premiereTimestamp) {
premiereTime = humanFriendlyTimestamp(data.video.premiereTimestamp);
premiereUpdateInterval = setInterval(async () => {
data = await getWatchDetails(data.video.videoId, page.url);
if (data.video.premiereTimestamp) {
premiereTime = humanFriendlyTimestamp(data.video.premiereTimestamp);
} else {
clearInterval(premiereUpdateInterval);
}
}, 60000);
}
});
});
onDestroy(() => {
@@ -271,6 +278,15 @@
if (premiereUpdateInterval) {
clearInterval(premiereUpdateInterval);
}
if (
playerElement?.paused ||
playerElement?.ended ||
playerElement?.currentTime === 0 ||
playerElement?.readyState === 2
) {
playerState.set(undefined);
}
});
async function goToCurrentPlaylistItem() {