fix(startTime): fix start time on web

This commit is contained in:
2026-08-14 16:50:31 +02:00
parent 1dbffadb62
commit ba7a2b6a6d
3 changed files with 55 additions and 14 deletions
@@ -298,6 +298,48 @@ class OmniPlayer(
.build() .build()
} }
private fun sourceOf(item: MediaItem): Source {
val extras = item.requestMetadata.extras
val meta = item.mediaMetadata
return Source(
src = VideoSrc(
uri = item.localConfiguration?.uri?.toString() ?: item.mediaId,
mimeType = item.localConfiguration?.mimeType,
headers = emptyMap(),
),
startTime = null,
subtitles = item.localConfiguration?.subtitleConfigurations.orEmpty().map {
Subtitle(
id = it.id ?: it.uri.toString(),
link = it.uri.toString(),
mimeType = it.mimeType,
language = it.language,
label = it.label,
)
}.toTypedArray(),
fonts = null,
metadata = Metadata(
title = meta.title?.toString() ?: "",
album = meta.albumTitle?.toString(),
artist = meta.artist?.toString(),
imageLink = meta.artworkUri?.toString(),
// we did not load it, we don't know what comes around it.
hasPrev = null,
hasNext = null,
),
mixAudio = null,
castId = extras?.getString(CAST_ID_EXTRA),
castData = extras?.getString(CAST_DATA_EXTRA)?.let { raw ->
try {
val json = JSONObject(raw)
json.keys().asSequence().associateWith { json.optString(it) }
} catch (_: Throwable) {
null
}
},
)
}
fun setVideoView(surfaceView: android.view.SurfaceView) { fun setVideoView(surfaceView: android.view.SurfaceView) {
runOnMainThread { runOnMainThread {
localPlayer.setVideoSurfaceView(surfaceView) localPlayer.setVideoSurfaceView(surfaceView)
+2 -14
View File
@@ -1,13 +1,7 @@
import { createPlayer } from "@videojs/react"; import { createPlayer } from "@videojs/react";
import { GoogleCast } from "@videojs/react/media/google-cast"; import { GoogleCast } from "@videojs/react/media/google-cast";
import { videoFeatures } from "@videojs/react/video"; import { videoFeatures } from "@videojs/react/video";
import { import { createContext, type ReactNode, useContext, useEffect } from "react";
createContext,
type ReactNode,
useContext,
useEffect,
useRef,
} from "react";
import { usePlayerState } from "./events"; import { usePlayerState } from "./events";
import { WebOmniPlayer } from "./player.web"; import { WebOmniPlayer } from "./player.web";
import type { OmniPlayer, PlayerBackend } from "./types/player"; import type { OmniPlayer, PlayerBackend } from "./types/player";
@@ -58,16 +52,10 @@ const PlayerInitializer = ({
}) => { }) => {
const store = VideoPlayer.usePlayer(); const store = VideoPlayer.usePlayer();
const player = useLazyRef(() => new WebOmniPlayer(store)); const player = useLazyRef(() => new WebOmniPlayer(store));
const seekedForSrc = useRef<string | undefined>(undefined);
useEffect(() => { useEffect(() => {
player.source = source; player.source = source;
const uri = source?.src?.uri; }, [source]);
if (uri !== seekedForSrc.current) {
seekedForSrc.current = uri;
if (source?.startTime) store.seek(source.startTime);
}
}, [source, store]);
useEffect(() => { useEffect(() => {
player.showNotification = showNotification; player.showNotification = showNotification;
+11
View File
@@ -134,6 +134,17 @@ export const OmniView = ({
[], [],
); );
const player = usePlayer();
const uri = source?.src.uri;
const startTime = source?.startTime;
const prevUri = useRef<string | undefined>(undefined);
useEffect(() => {
if (!uri) return;
if (startTime) player.currentTime = startTime;
if (autoplay && prevUri.current && prevUri.current !== uri) player.play();
prevUri.current = uri;
}, [player, uri, startTime, autoplay]);
// While casting, the receiver renders subtitles (the player forwards the // While casting, the receiver renders subtitles (the player forwards the
// selection); skip rendering them locally on the idle <video>. // selection); skip rendering them locally on the idle <video>.
const castStatus = usePlayerState("castStatus"); const castStatus = usePlayerState("castStatus");