diff --git a/packages/app/package.json b/packages/app/package.json index a2b60316..7d7e054f 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -4,6 +4,8 @@ "dependencies": { "@cashu/cashu-ts": "^1.0.0-rc.3", "@here/maps-api-for-javascript": "^1.50.0", + "@livekit/components-react": "^2.5.4", + "@livekit/protocol": "^1.22.0", "@noble/curves": "^1.4.0", "@noble/hashes": "^1.4.0", "@scure/base": "^1.1.6", @@ -29,6 +31,7 @@ "highlight.js": "^11.8.0", "latlon-geohash": "^2.0.0", "light-bolt11-decoder": "^2.1.0", + "livekit-client": "^2.5.2", "lottie-react": "^2.4.0", "marked": "^9.1.0", "marked-footnote": "^1.0.0", diff --git a/packages/app/src/Components/LiveStream/LiveEvent.tsx b/packages/app/src/Components/LiveStream/LiveEvent.tsx index d7d0a270..35e6534d 100644 --- a/packages/app/src/Components/LiveStream/LiveEvent.tsx +++ b/packages/app/src/Components/LiveStream/LiveEvent.tsx @@ -1,18 +1,35 @@ -import { NostrEvent, NostrLink } from "@snort/system"; -import { useState } from "react"; +import { NostrLink, TaggedNostrEvent } from "@snort/system"; +import { lazy, Suspense, useState } from "react"; import { FormattedMessage } from "react-intl"; import { Link } from "react-router-dom"; import Icon from "@/Components/Icons/Icon"; import { findTag } from "@/Utils"; +import { extractStreamInfo } from "@/Utils/stream"; +import NoteAppHandler from "../Event/Note/NoteAppHandler"; import ProfileImage from "../User/ProfileImage"; +const LiveKitRoom = lazy(() => import("./livekit")); -export function LiveEvent({ ev }: { ev: NostrEvent }) { - const title = findTag(ev, "title"); - const status = findTag(ev, "status"); - const starts = Number(findTag(ev, "starts")); - const host = ev.tags.find(a => a[0] === "p" && a[3] === "host")?.[1] ?? ev.pubkey; + +export function LiveEvent({ ev }: { ev: TaggedNostrEvent }) { + const service = ev.tags.find(a => a[0] === "streaming")?.at(1); + function inner() { + if (service?.endsWith(".m3u8")) { + return + } else if (service?.startsWith("wss+livekit://")) { + return + + + } + return + } + + return inner(); +} + +function LiveStreamEvent({ ev }: { ev: TaggedNostrEvent }) { + const { title, status, starts, host } = extractStreamInfo(ev); const [play, setPlay] = useState(false); function statusLine() { @@ -38,7 +55,7 @@ export function LiveEvent({ ev }: { ev: NostrEvent }) { return ( {new Intl.DateTimeFormat(undefined, { dateStyle: "full", timeStyle: "short" }).format( - new Date(starts * 1000), + new Date(Number(starts) * 1000), )} ); @@ -73,8 +90,6 @@ export function LiveEvent({ ev }: { ev: NostrEvent }) { const link = `https://zap.stream/embed/${NostrLink.fromEvent(ev).encode()}`; return (