Initial commit — YT Hub

Self-hosted personal YouTube management app.
FastAPI + SQLite backend, React + Vite + Tailwind frontend.
Dockerfiles and compose included for Portainer deployment.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
inputnoise
2026-05-25 20:09:04 +02:00
commit 1827dd6c4e
63 changed files with 14480 additions and 0 deletions

65
frontend/src/App.jsx Normal file
View File

@@ -0,0 +1,65 @@
import { BrowserRouter, Routes, Route, Navigate, useParams } from "react-router-dom";
import { AuthProvider, useAuth } from "./hooks/useAuth";
import Layout from "./components/Layout";
import Home from "./pages/Home";
import SearchResults from "./pages/SearchResults";
import ChannelPage from "./pages/Channel";
import DownloadsPage from "./pages/Downloads";
import DiscoveryPage from "./pages/Discovery";
import LoginPage from "./pages/Login";
import WatchPage from "./pages/Watch";
function WatchWrapper() {
const { youtubeVideoId } = useParams();
return <WatchPage key={youtubeVideoId} />;
}
import FollowingPage from "./pages/Following";
import LikedPage from "./pages/Liked";
import SettingsPage from "./pages/Settings";
import ContinueWatchingPage from "./pages/ContinueWatching";
import QueuePage from "./pages/Queue";
import HistoryPage from "./pages/History";
import StatsPage from "./pages/Stats";
import CollectionsPage from "./pages/Collections";
function RequireAuth({ children }) {
const { user, loading } = useAuth();
if (loading) return <div className="flex items-center justify-center h-screen text-zinc-500">Loading</div>;
if (!user) return <Navigate to="/login" replace />;
return children;
}
export default function App() {
return (
<BrowserRouter>
<AuthProvider>
<Routes>
<Route path="/login" element={<LoginPage />} />
<Route
path="/"
element={
<RequireAuth>
<Layout />
</RequireAuth>
}
>
<Route index element={<Home />} />
<Route path="search" element={<SearchResults />} />
<Route path="channels/:id" element={<ChannelPage />} />
<Route path="downloads" element={<DownloadsPage />} />
<Route path="following" element={<FollowingPage />} />
<Route path="discovery" element={<DiscoveryPage />} />
<Route path="liked" element={<LikedPage />} />
<Route path="continue-watching" element={<ContinueWatchingPage />} />
<Route path="queue" element={<QueuePage />} />
<Route path="settings" element={<SettingsPage />} />
<Route path="history" element={<HistoryPage />} />
<Route path="stats" element={<StatsPage />} />
<Route path="collections" element={<CollectionsPage />} />
<Route path="watch/:youtubeVideoId" element={<WatchWrapper />} />
</Route>
</Routes>
</AuthProvider>
</BrowserRouter>
);
}