Browse Source

fix electron youtube and streaming components

imwald
Silberengel 3 weeks ago
parent
commit
d4ba042624
  1. 4
      package-lock.json
  2. 2
      package.json
  3. 4
      src/components/VideoPlayer/index.tsx
  4. 29
      src/components/YoutubeEmbeddedPlayer/index.tsx

4
package-lock.json generated

@ -1,12 +1,12 @@ @@ -1,12 +1,12 @@
{
"name": "imwald",
"version": "22.4.1",
"version": "22.4.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "imwald",
"version": "22.4.1",
"version": "22.4.2",
"license": "MIT",
"dependencies": {
"@asciidoctor/core": "^3.0.4",

2
package.json

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
{
"name": "imwald",
"version": "22.4.1",
"version": "22.4.2",
"description": "Imwald — a user-friendly Nostr client focused on relay feed browsing, publications, and relay discovery",
"private": true,
"type": "module",

4
src/components/VideoPlayer/index.tsx

@ -1,3 +1,4 @@ @@ -1,3 +1,4 @@
import { isImwaldElectron } from '@/lib/client-platform'
import { isHlsPlaylistUrl } from '@/lib/url'
import { cn, isInViewport } from '@/lib/utils'
import { useContentPolicy } from '@/providers/ContentPolicyProvider'
@ -68,7 +69,8 @@ export default function VideoPlayer({ @@ -68,7 +69,8 @@ export default function VideoPlayer({
if (!video) return
const hls = new Hls({
enableWorker: true,
// `file:` packaged Electron cannot load bundled worker URLs reliably; main-thread demux is fine here.
enableWorker: !isImwaldElectron(),
lowLatencyMode: true
})
hls.loadSource(src)

29
src/components/YoutubeEmbeddedPlayer/index.tsx

@ -1,3 +1,4 @@ @@ -1,3 +1,4 @@
import { isImwaldElectron } from '@/lib/client-platform'
import { ensureYouTubeIframeApi } from '@/lib/youtube-iframe-api'
import { parseYoutubeUrl } from '@/lib/youtube-url'
import { cn } from '@/lib/utils'
@ -32,6 +33,8 @@ export default function YoutubeEmbeddedPlayer({ @@ -32,6 +33,8 @@ export default function YoutubeEmbeddedPlayer({
}, [autoLoadMedia])
const showEmbed = mustLoad || autoLoadMedia || userClickedLoad
/** Packaged app uses `file:`; YT’s JS API often errors there; a plain embed iframe works. */
const useNativeEmbed = isImwaldElectron()
const posterUrl = useMemo(
() => (videoId ? `https://i.ytimg.com/vi/${videoId}/hqdefault.jpg` : undefined),
@ -48,6 +51,7 @@ export default function YoutubeEmbeddedPlayer({ @@ -48,6 +51,7 @@ export default function YoutubeEmbeddedPlayer({
)
useEffect(() => {
if (useNativeEmbed) return
if (!videoId || !containerRef.current || !showEmbed) return
let cancelled = false
@ -92,9 +96,9 @@ export default function YoutubeEmbeddedPlayer({ @@ -92,9 +96,9 @@ export default function YoutubeEmbeddedPlayer({
// React often removes the host node first when auto-load media is turned off; YT then hits removeChild errors.
}
}
}, [videoId, showEmbed])
}, [videoId, showEmbed, useNativeEmbed])
if (error) {
if (error && !useNativeEmbed) {
return <ExternalLink url={url} />
}
@ -113,6 +117,27 @@ export default function YoutubeEmbeddedPlayer({ @@ -113,6 +117,27 @@ export default function YoutubeEmbeddedPlayer({
if (!videoId && !initSuccess) {
return <ExternalLink url={url} />
}
if (useNativeEmbed && videoId) {
const embedSrc = `https://www.youtube.com/embed/${encodeURIComponent(videoId)}?playsinline=1&rel=0`
return (
<div
className={cn(
'not-prose rounded-lg border overflow-hidden w-full max-w-[400px]',
frameClassName
)}
>
<iframe
className="h-full w-full min-h-[12rem] border-0"
src={embedSrc}
title="YouTube video"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
/>
</div>
)
}
return (
<div
className={cn(

Loading…
Cancel
Save