My Library
My Library est un projet personnel qui a pour but de garder à jour l'avancement dans les animes, les films, les webtoons, etc...
Stack technique
| Couche |
Technologie |
| Frontend |
HTML / CSS / JS Vanilla |
| Backend |
Node.js + Express |
| Base de données |
SQLite (better-sqlite3) + sauvegarde JSON |
| Auth |
Aucune |
| UI |
CSS Vanilla (Mobile First) |
| Upload |
Multer (png/jpg, max 5 Mo) |
Schéma de base de données
CREATE TABLE items (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
cover_image TEXT,
type TEXT NOT NULL CHECK(type IN ('anime','serie','webtoon','film','video','livre')),
status TEXT NOT NULL CHECK(status IN ('à regarder','en cours','terminé')) DEFAULT 'à regarder',
location TEXT, -- JSON: [{"name": "...", "url": "..."}]
rating REAL CHECK(rating >= 0 AND rating <= 100),
is_favorite INTEGER DEFAULT 0,
description TEXT,
metadata TEXT, -- JSON selon le type
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE TABLE folders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE TABLE folder_items (
folder_id INTEGER NOT NULL REFERENCES folders(id) ON DELETE CASCADE,
item_id INTEGER NOT NULL REFERENCES items(id) ON DELETE CASCADE,
PRIMARY KEY (folder_id, item_id)
);
CREATE TABLE tags (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE
);
CREATE TABLE item_tags (
item_id INTEGER NOT NULL REFERENCES items(id) ON DELETE CASCADE,
tag_id INTEGER NOT NULL REFERENCES tags(id) ON DELETE CASCADE,
PRIMARY KEY (item_id, tag_id)
);
Métadonnées par type (JSON dans metadata)
| type |
metadata |
anime, serie |
{"season": int, "episode": int, "timecode": {"hours": int, "minutes": int, "seconds": int}} |
webtoon |
{"season": int, "chapter": int} |
film, video |
{"timecode": {"hours": int, "minutes": int, "seconds": int}} |
livre |
{"volume": int, "chapter": int, "page": int} |
Contrainte : si status = 'en cours'
| type |
Champs obligatoires |
| anime/serie |
season + episode |
| webtoon |
season + chapter |
| film/video |
(timecode optionnel) |
| livre |
volume + page (chapter optionnel) |
Routes API REST
GET /api/items
Query: ?type=&status=&folder_id=&tag=&search=&sort=&order=
POST /api/items
Body: { title, type, status, location, rating, is_favorite, description, metadata, folder_ids[], tag_ids[] }
GET /api/items/:id
PUT /api/items/:id
DELETE /api/items/:id
GET /api/folders
POST /api/folders Body: { name }
DELETE /api/folders/:id
PUT /api/folders/:id/items Body: { item_ids: [1, 2, 3] }
GET /api/tags
POST /api/tags Body: { name }
POST /api/items/:id/tags Body: { tag_ids: [1, 2] }
POST /api/upload multipart/form-data -> { url: "/uploads/fichier.jpg" }
GET /api/export?format=json|csv
Arborescence du projet
my-library/
├── package.json
├── server.js # Point d'entrée Express
├── db/
│ ├── schema.js # Création des tables SQLite
│ ├── database.js # Initialisation + helper queries
│ └── backup.js # Export JSON/CSV
├── routes/
│ ├── items.js # CRUD items
│ ├── folders.js # CRUD dossiers
│ ├── tags.js # CRUD tags + item_tags
│ └── upload.js # Upload d'image
├── public/
│ ├── index.html # Page principale
│ ├── style.css # Styles vanilla
│ ├── app.js # Tout le JS client
│ └── uploads/ # Images uploadées
└── data/
└── library.db # Fichier SQLite (généré)
Fonctionnalités
- Créer des dossiers (animes, films à voir, livres fantasy, etc...)
- Ajouter des items à un dossier (un item peut être dans plusieurs dossiers)
- Recherche et filtres (par type, statut, dossier, tag, texte)
- Upload d'image de couverture (png/jpg, 5 Mo max)
- Export JSON / CSV
- Tags libres avec table dédiée