Initial commit: WatchStack v0.1.0
- 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
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user