Initial commit: LiveStream Platform

Backend: FastAPI + SQLAlchemy + SQLite
Frontend: React + Vite + Ant Design (serif Anthropic theme)
Media server: MediaMTX with edge node support
Load balancing: round-robin / weighted / least-conn
Multicast detection with automatic fallback
Transcoding support via FFmpeg (configurable quality)
hls.js player with line & quality switching
Admin panel with password auth
Windows compatible scripts
This commit is contained in:
admin committed 2026-08-07 15:02:07 +08:00
commit 2e4594fa77
43 files changed
+2196

No files matched your search

+52
View File
@@ -0,0 +1,52 @@
import { useState, useEffect } from 'react'
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'
import { ConfigProvider } from 'antd'
import theme from './theme/anthropic'
import AdminLayout from './admin/AdminLayout'
import LoginPage from './admin/LoginPage'
import Dashboard from './admin/pages/Dashboard'
import StreamList from './admin/pages/StreamList'
import StreamForm from './admin/pages/StreamForm'
import NodeManager from './admin/pages/NodeManager'
import SettingsPage from './admin/pages/Settings'
import WatchPage from './viewer/pages/WatchPage'
import { verifyToken, getToken } from './api/auth'
function AdminGuard({ children }: { children: React.ReactNode }) {
const [authed, setAuthed] = useState<boolean | null>(null)
useEffect(() => {
const token = getToken()
if (!token) { setAuthed(false); return }
verifyToken().then(setAuthed)
}, [])
if (authed === null) return null
if (!authed) return <Navigate to="/admin/login" replace />
return <>{children}</>
}
export default function App() {
return (
<ConfigProvider theme={theme}>
<BrowserRouter>
<Routes>
<Route path="/watch/:id" element={<WatchPage />} />
<Route path="/admin/login" element={<LoginPage />} />
<Route path="/admin" element={
<AdminGuard>
<AdminLayout />
</AdminGuard>
}>
<Route index element={<Dashboard />} />
<Route path="streams" element={<StreamList />} />
<Route path="streams/new" element={<StreamForm />} />
<Route path="nodes" element={<NodeManager />} />
<Route path="settings" element={<SettingsPage />} />
</Route>
<Route path="/" element={<Navigate to="/admin" replace />} />
</Routes>
</BrowserRouter>
</ConfigProvider>
)
}