No description
  • JavaScript 59.9%
  • CSS 29.3%
  • HTML 10.6%
  • Dockerfile 0.2%
Find a file
2026-07-21 13:25:50 +02:00
data création de la structure de dossiers 2026-07-20 15:28:03 +02:00
db gestion des backups 2026-07-20 22:01:26 +02:00
models Séparation des responsabilités (MVC) en créant des fichiers séparés pour les models + factorisation de code dupliqué + suppression des log, des paramètres inutilisés, etc... 2026-07-21 12:01:37 +02:00
public apparition du menu hamburger à gauche pour éviter qu'il dépasse à droite 2026-07-21 13:16:09 +02:00
routes Séparation des responsabilités (MVC) en créant des fichiers séparés pour les models + factorisation de code dupliqué + suppression des log, des paramètres inutilisés, etc... 2026-07-21 12:01:37 +02:00
.dockerignore ajout de la config docker 2026-07-21 13:25:50 +02:00
.env.example ajout de l'authentification + cohérence des logos 2026-07-21 10:24:31 +02:00
.gitignore modification du gitignore 2026-07-21 11:15:45 +02:00
config.js Séparation des responsabilités (MVC) en créant des fichiers séparés pour les models + factorisation de code dupliqué + suppression des log, des paramètres inutilisés, etc... 2026-07-21 12:01:37 +02:00
docker-compose.yml ajout de la config docker 2026-07-21 13:25:50 +02:00
Dockerfile ajout de la config docker 2026-07-21 13:25:50 +02:00
package-lock.json ajout de l'authentification + cohérence des logos 2026-07-21 10:24:31 +02:00
package.json ajout de la config docker 2026-07-21 13:25:50 +02:00
README.md first commit 2026-07-20 14:52:00 +02:00
server.js Séparation des responsabilités (MVC) en créant des fichiers séparés pour les models + factorisation de code dupliqué + suppression des log, des paramètres inutilisés, etc... 2026-07-21 12:01:37 +02:00

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