feat: Bibliotheksseite, Papierkorb und manuelles Anlegen

Die Detailseite hängt jetzt an der internen Titel-ID statt an der TMDB-ID —
nur so bekommen manuell angelegte Titel dieselbe Seite. Treffer aus der Suche
laufen über /tmdb/<art>/<id>, das den Titel holt und weiterleitet.

Der Fortschritt einer ganzen Liste wird in einer Abfrage gezählt statt je
Eintrag; bei 300 Titeln wären das sonst 300 Rundreisen zur Datenbank.

Entfernte Titel wandern für 30 Tage in den Papierkorb und behalten ihren
Fortschritt.
This commit is contained in:
Florian Wilde
2026-09-01 19:24:51 +02:00
parent f613136e8a
commit f9ce2f7021
7 changed files with 557 additions and 220 deletions
+8 -1
View File
@@ -56,6 +56,13 @@ export default async function SearchPage({
<SearchField initialQuery={query} filter={filter} filters={FILTERS} />
<p className="mt-3 text-sm text-[var(--fl-faint)]">
Nichts dabei?{" "}
<Link href="/titel/neu" className="text-[var(--fl-accent)] underline-offset-4 hover:underline">
Titel selbst anlegen
</Link>
</p>
<div className="mt-8">
{!env.tmdb.isConfigured ? (
<Notice tone="warning">
@@ -107,7 +114,7 @@ async function Results({ query, filter }: { query: string; filter: Filter }) {
{items.map((item) => (
<li key={`${item.type}-${item.tmdbId}`}>
<Link
href={`/titel/${item.type === "tv" ? "serie" : "film"}/${item.tmdbId}`}
href={`/tmdb/${item.type === "tv" ? "serie" : "film"}/${item.tmdbId}`}
className="fl-poster-card group block focus:outline-none"
>
<Poster path={item.posterPath} alt={item.title} size="w342" />