import Link from "next/link"; import { requireUser } from "@/lib/auth"; import { getSettings } from "@/lib/settings"; import { env } from "@/lib/env"; import { getContinueWatching, getNewlyAvailable, getUpcomingEpisodes, } from "@/lib/stats"; import { prisma } from "@/lib/db"; import { episodeCode, formatDate, formatRelative, isUpcoming } from "@/lib/labels"; import { AppShell } from "@/components/AppShell"; import { Poster } from "@/components/Poster"; import { ProgressBar } from "@/components/ProgressBar"; import { QuickWatch } from "@/components/library/QuickWatch"; /** * Übersicht: der Einstieg für „was schaue ich als Nächstes". * * Drei Fragen, drei Bereiche — weiterschauen, was demnächst kommt, was auf der * Watchlist verfügbar geworden ist. */ export default async function DashboardPage() { const user = await requireUser(); const settings = await getSettings(); const now = new Date(); const inFourWeeks = new Date(now.getTime() + 28 * 86_400_000); const [continueItems, upcoming, available, libraryCount] = await Promise.all([ getContinueWatching(user.id, 8), getUpcomingEpisodes(user.id, now, inFourWeeks), getNewlyAvailable(user.id, user.region), prisma.libraryEntry.count({ where: { userId: user.id, deletedAt: null } }), ]); if (libraryCount === 0) { return ( ); } return (

Übersicht

Weiterschauen

Alle laufenden
{continueItems.length === 0 ? (
Gerade läuft nichts. Setz eine Serie auf „Schaue gerade", dann steht sie hier.
) : ( )}

Demnächst

Zum Kalender
{upcoming.length === 0 ? (

In den nächsten vier Wochen ist keine Episode deiner Serien angekündigt.

) : (
    {upcoming.slice(0, 6).map((episode) => (
  1. {formatDate(episode.airDate)} {episode.title} {episodeCode(episode.seasonNumber, episode.episodeNumber)}
  2. ))}
)}

Neu verfügbar

{available.length === 0 ? (

Auf deiner Watchlist ist zuletzt nichts neu dazugekommen. Sobald ein Titel auf einem Dienst in {user.region} auftaucht, steht er hier.

) : (
    {available.slice(0, 5).map((item) => (
  • {item.title}

    {item.providers.map((provider) => provider.name).join(", ")} ·{" "} {formatRelative(item.since)}

  • ))}
)}
); } function EmptyStart({ name, tmdbReady }: { name: string; tmdbReady: boolean }) { return (

Hallo {name.split(" ")[0]}.

Deine Bibliothek ist noch leer. Such dir eine Serie oder einen Film — danach findest du hier, was als Nächstes dran ist, welche Episoden demnächst kommen und was auf deiner Watchlist verfügbar geworden ist.

Titel suchen Titel selbst anlegen
{!tmdbReady && (

Es ist noch kein TMDB-Schlüssel hinterlegt. Ohne ihn findet die Suche keine Metadaten — trage TMDB_API_KEY in der .env ein und starte die Instanz neu.

)}
); }