import { useState } from 'react' import toast from 'react-hot-toast' import { Copy, ExternalLink, PlaySquare, X } from 'lucide-react' import { playbackAPI, type ExternalPlayer } from '../api/playback' export function ExternalPlayerButton({ mediaId, label = '外部播放器', compact = false, }: { mediaId: string label?: string compact?: boolean }) { const [open, setOpen] = useState(false) const [loading, setLoading] = useState(false) const [players, setPlayers] = useState([]) const [streamURL, setStreamURL] = useState('') const load = async () => { setLoading(true) try { const [playerData, urlData] = await Promise.all([ playbackAPI.externalPlayers(mediaId), playbackAPI.externalURL(mediaId), ]) setPlayers(playerData.players ?? []) setStreamURL(urlData.url) setOpen(true) } catch (err: unknown) { const msg = (err as { response?: { data?: { error?: string } } })?.response?.data?.error ?? '生成外部播放链接失败' toast.error(msg) } finally { setLoading(false) } } return ( <> {open && ( setOpen(false)} /> )} ) } function ExternalPlayerModal({ players, streamURL, onClose, }: { players: ExternalPlayer[] streamURL: string onClose: () => void }) { const copy = async (value: string) => { await navigator.clipboard.writeText(value) toast.success('播放链接已复制') } return (
event.stopPropagation()}>

外部播放器播放

链接已包含临时播放 Token,可复制到 VLC、Infuse、VidHub、SenPlayer 等客户端。

直链播放地址
{players.map((player) => ( {player.name} ))}
) }