- FastAPI + SQLite backend with REST API - Polymorphic Media model (book + series) - Cover lookup via Open Library - Vanilla HTML/CSS/JS frontend (MAL-inspired) - Dark theme, status tabs, drawer detail, stats modal - 8 seed demo entries
76 lines
2.8 KiB
Markdown
76 lines
2.8 KiB
Markdown
# WatchStack
|
||
|
||
Eine Watchlist für **Bücher, Serien & mehr** — inspiriert von MyAnimeList, aber mit eigenem Konzept.
|
||
|
||
## Features
|
||
|
||
- 📚 **Bücher**: Titel, Autor, Bände, Kapitel, Seiten, ISBN-Cover von Open Library, Status, Bewertung, Notizen, Genre, Tags
|
||
- 📺 **Serien**: Titel, Staffeln, Episoden, Sendezeitraum, Sender/Streaming, Status, Bewertung, Notizen, Genre, Tags
|
||
- 🔎 **Suche & Filter**: Volltext, Status, Genre, Tag, Bewertung, Sortierung
|
||
- 📊 **Dashboard**: Statistik pro Medium (Anzahl, verteilte Status, Durchschnittsbewertung)
|
||
- ⭐ **Bewertungen**: 1–10 Skala
|
||
- 🏷️ **Genres & Tags**: frei verwaltbar, vielen Einträgen zuweisbar
|
||
- 🌙 **Dark Theme** als Default
|
||
- 💾 **Lokal**: SQLite, single-user, kein Login nötig
|
||
- 🐳 Optional: Docker
|
||
|
||
## Tech-Stack
|
||
|
||
- **Backend**: Python 3.11+, FastAPI, SQLAlchemy 2.x, SQLite
|
||
- **Frontend**: Vanilla HTML + CSS + JavaScript (kein Build-Step), HTMX-light Pattern
|
||
- **Cover**: Open Library API (Bücher), URL (Serien)
|
||
|
||
## Quickstart
|
||
|
||
```bash
|
||
# 1) Backend-Env
|
||
python3 -m venv .venv
|
||
source .venv/bin/activate
|
||
pip install -r requirements.txt
|
||
|
||
# 2) Starten (legt data/watchstack.db automatisch an + seedet Beispieldaten)
|
||
uvicorn app.main:app --reload --host 127.0.0.1 --port 8000
|
||
|
||
# 3) Browser öffnen
|
||
xdg-open http://127.0.0.1:8000 # oder einfach manuell
|
||
```
|
||
|
||
## Projektstruktur
|
||
|
||
```
|
||
watchlist/
|
||
├── app/
|
||
│ ├── main.py # FastAPI-App + Routes
|
||
│ ├── database.py # Engine + Session
|
||
│ ├── models.py # SQLAlchemy-Modelle
|
||
│ ├── schemas.py # Pydantic-Schemas
|
||
│ ├── crud.py # DB-Logik
|
||
│ ├── seed.py # Beispieldaten
|
||
│ ├── external.py # Open-Library-API
|
||
│ └── static/
|
||
│ ├── css/style.css
|
||
│ ├── js/app.js
|
||
│ └── img/
|
||
├── data/ # SQLite-DB (gitignored)
|
||
├── tests/
|
||
├── requirements.txt
|
||
└── README.md
|
||
```
|
||
|
||
## API-Übersicht (Auszug)
|
||
|
||
| Methode | Pfad | Zweck |
|
||
| ------- | --------------------------------- | ------------------------------ |
|
||
| GET | `/api/media?type=book\|series` | Liste mit Filter & Suche |
|
||
| POST | `/api/media` | Neuen Eintrag anlegen |
|
||
| GET | `/api/media/{id}` | Detail |
|
||
| PATCH | `/api/media/{id}` | Ändern (Status, Bewertung …) |
|
||
| DELETE | `/api/media/{id}` | Löschen |
|
||
| GET | `/api/stats` | Aggregierte Stats |
|
||
| GET | `/api/lookup/book?isbn=…` | Cover per Open Library |
|
||
| GET | `/` | Web-UI |
|
||
|
||
## Lizenz
|
||
|
||
MIT
|