From a83b563903f0845096dc38523a7fc7171ef84e81 Mon Sep 17 00:00:00 2001 From: Samuel Newman <10959775+mozzius@users.noreply.github.com> Date: Fri, 2 Aug 2024 19:04:20 +0200 Subject: [PATCH] get subtitle track from stream --- .../util/post-embeds/VideoEmbedInner.web.tsx | 8 ++++++++ .../com/util/post-embeds/VideoWebControls.tsx | 1 + .../util/post-embeds/VideoWebControls.web.tsx | 19 +++++++++++++++---- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/view/com/util/post-embeds/VideoEmbedInner.web.tsx b/src/view/com/util/post-embeds/VideoEmbedInner.web.tsx index b78c505346..4057974bb8 100644 --- a/src/view/com/util/post-embeds/VideoEmbedInner.web.tsx +++ b/src/view/com/util/post-embeds/VideoEmbedInner.web.tsx @@ -86,6 +86,7 @@ export function VideoPlayer({ const containerRef = useRef(null) const ref = useRef(null) const [focused, setFocused] = useState(false) + const [hasSubtitleTrack, setHasSubtitleTrack] = useState(false) useEffect(() => { if ( @@ -97,6 +98,12 @@ export function VideoPlayer({ // initial value, later on it's managed by Controls hls.autoLevelCapping = 0 + hls.on(Hls.Events.SUBTITLE_TRACKS_UPDATED, (event, data) => { + if (data.subtitleTracks.length > 0) { + setHasSubtitleTrack(true) + } + }) + return () => { hls.detachMedia() } @@ -151,6 +158,7 @@ export function VideoPlayer({ setFocused={setFocused} onScreen={onScreen} enterFullscreen={enterFullscreen} + hasSubtitleTrack={hasSubtitleTrack} /> diff --git a/src/view/com/util/post-embeds/VideoWebControls.tsx b/src/view/com/util/post-embeds/VideoWebControls.tsx index e6cd43d669..a37b07243f 100644 --- a/src/view/com/util/post-embeds/VideoWebControls.tsx +++ b/src/view/com/util/post-embeds/VideoWebControls.tsx @@ -10,6 +10,7 @@ export function Controls({}: { setFocused: (focused: boolean) => void onScreen: boolean enterFullscreen: () => void + hasSubtitleTrack: boolean }): React.ReactElement { throw new Error('Web-only component') } diff --git a/src/view/com/util/post-embeds/VideoWebControls.web.tsx b/src/view/com/util/post-embeds/VideoWebControls.web.tsx index ab1455582e..8787fa8d17 100644 --- a/src/view/com/util/post-embeds/VideoWebControls.web.tsx +++ b/src/view/com/util/post-embeds/VideoWebControls.web.tsx @@ -37,6 +37,7 @@ export function Controls({ setFocused, onScreen, enterFullscreen, + hasSubtitleTrack, }: { videoRef: React.RefObject hls: Hls @@ -46,6 +47,7 @@ export function Controls({ setFocused: (focused: boolean) => void onScreen: boolean enterFullscreen: () => void + hasSubtitleTrack: boolean }) { const { play, @@ -58,6 +60,7 @@ export function Controls({ duration, buffering, error, + canPlay, } = useVideoUtils(videoRef) const t = useTheme() const {_} = useLingui() @@ -117,6 +120,14 @@ export function Controls({ } }, [hls, focused]) + useEffect(() => { + if (hasSubtitleTrack && subtitlesEnabled && canPlay) { + hls.subtitleTrack = 0 + } else { + hls.subtitleTrack = -1 + } + }, [hasSubtitleTrack, subtitlesEnabled, hls, canPlay]) + // clicking on any button should focus the player, if it's not already focused const drawFocus = useCallback(() => { if (!active) { @@ -160,9 +171,6 @@ export function Controls({ const showControls = (focused && !playing) || (interactingViaKeypress ? hasFocus : hovered) - // TODO: get from embed - const videoHasSubtitles = true - return (
{formatTime(currentTime)} / {formatTime(duration)} - {videoHasSubtitles && ( + {hasSubtitleTrack && (