mirror of
https://github.com/supermemoryai/supermemory.git
synced 2026-05-17 12:20:04 +00:00
77 lines
2 KiB
TypeScript
77 lines
2 KiB
TypeScript
"use client"
|
|
|
|
import { useQuery } from "@tanstack/react-query"
|
|
|
|
export function isYouTubeUrl(url: string | undefined | null): boolean {
|
|
if (!url) return false
|
|
return (
|
|
url.includes("youtube.com") ||
|
|
url.includes("youtu.be") ||
|
|
url.includes("m.youtube.com")
|
|
)
|
|
}
|
|
|
|
export function extractYouTubeVideoId(
|
|
url: string | undefined | null,
|
|
): string | null {
|
|
if (!url) return null
|
|
|
|
// Handle youtu.be format
|
|
const youtuBeMatch = url.match(/(?:youtu\.be\/)([a-zA-Z0-9_-]{11})/)
|
|
if (youtuBeMatch?.[1]) return youtuBeMatch[1]
|
|
|
|
// Handle youtube.com/watch?v= format
|
|
const watchMatch = url.match(/(?:youtube\.com\/watch\?v=)([a-zA-Z0-9_-]{11})/)
|
|
if (watchMatch?.[1]) return watchMatch[1]
|
|
|
|
// Handle youtube.com/embed/ format
|
|
const embedMatch = url.match(/(?:youtube\.com\/embed\/)([a-zA-Z0-9_-]{11})/)
|
|
if (embedMatch?.[1]) return embedMatch[1]
|
|
|
|
// Handle m.youtube.com format
|
|
const mobileMatch = url.match(
|
|
/(?:m\.youtube\.com\/watch\?v=)([a-zA-Z0-9_-]{11})/,
|
|
)
|
|
if (mobileMatch?.[1]) return mobileMatch[1]
|
|
|
|
return null
|
|
}
|
|
|
|
export function useYouTubeChannelName(url: string | undefined | null) {
|
|
const videoId = extractYouTubeVideoId(url)
|
|
const videoUrl = videoId
|
|
? `https://www.youtube.com/watch?v=${videoId}`
|
|
: url || ""
|
|
|
|
return useQuery({
|
|
queryKey: ["youtube-channel", videoUrl],
|
|
queryFn: async () => {
|
|
if (!videoUrl) return null
|
|
|
|
try {
|
|
const response = await fetch(
|
|
`https://www.youtube.com/oembed?url=${encodeURIComponent(videoUrl)}&format=json`,
|
|
)
|
|
if (!response.ok) return null
|
|
const data = (await response.json()) as { author_name?: string }
|
|
return data.author_name || null
|
|
} catch {
|
|
return null
|
|
}
|
|
},
|
|
enabled: !!videoUrl && isYouTubeUrl(url),
|
|
staleTime: 1000 * 60 * 60 * 24,
|
|
retry: 1,
|
|
})
|
|
}
|
|
|
|
export function getAbsoluteUrl(url: string): string {
|
|
try {
|
|
const urlObj = new URL(url)
|
|
return urlObj.host.replace(/^www\./, "")
|
|
} catch {
|
|
const match = url.match(/^https?:\/\/([^/]+)/)
|
|
const host = match?.[1] ?? url.replace(/^https?:\/\//, "")
|
|
return host.replace(/^www\./, "")
|
|
}
|
|
}
|