mirror of
https://github.com/zoriya/react-native-omni.git
synced 2026-08-16 02:44:51 +00:00
fix(startTime): fix start time on web
This commit is contained in:
@@ -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
@@ -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;
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
Reference in New Issue
Block a user