Skip to content

erille/Retrofy

Repository files navigation

Retrofy

Python 3.11 Flask 3.0 SQLite Docker Spotify optional Website Last commit

Retrofy est une application Flask pour explorer, enrichir et administrer une collection de disques vinyles stockée dans une base SQLite existante. Elle propose une expérience de navigation proche d'une discothèque numérique: recherche, filtres par artiste/genre/année, fiches détaillées, inventaire exportable, pochettes d'albums et lecteur Spotify optionnel.

Site web: www.retrofy.info

Le projet est prévu pour tourner simplement avec Docker sur le port 8888, avec une base SQLite montée depuis l'hôte et un dossier persistant pour les images.

Fonctionnalités

  • Accueil avec une sélection aléatoire de 30 albums disposant d'une pochette.
  • Recherche par texte, artiste, année et genre.
  • Navigation latérale par artistes, genres et années avec compteurs.
  • Page inventaire avec tri, filtres, pagination progressive et export JSON ou CSV.
  • Fiches détaillées avec métadonnées du disque, notes, informations artiste et pochette.
  • Récupération automatique de pochettes via MusicBrainz et Cover Art Archive.
  • Téléversement manuel de pochettes après connexion administrateur.
  • Edition contrôlée des champs principaux après connexion administrateur.
  • Authentification administrateur avec mots de passe hachés en bcrypt.
  • Lecteur Spotify intégré sur les albums trouvés, lorsque les identifiants API sont configurés.
  • Favicon multi-plateforme servi depuis le volume d'images persistant.

Stack

  • Python 3.11
  • Flask 3.0
  • SQLite
  • Jinja templates
  • Docker et Docker Compose
  • MusicBrainz / Cover Art Archive pour les pochettes
  • Spotify Web API via spotipy pour l'intégration optionnelle

Prérequis

  • Docker et Docker Compose.
  • Une base SQLite existante disponible sur l'hôte.
  • Un dossier hôte persistant pour les pochettes et favicons.
  • Optionnel: des identifiants Spotify Developer pour afficher le lecteur Spotify.

Par défaut, la configuration Docker attend:

/srv/sqlite/ma_base.sqlite
/srv/retrofy_images/

Démarrage rapide

  1. Préparez la configuration:
cp env.example .env
python generate_password.py
  1. Renseignez au minimum les secrets dans .env:
SECRET_KEY=changez-moi-avec-une-valeur-longue-et-aleatoire
ADMIN_USERNAME=admin
ADMIN_PASSWORD_HASH=votre-hash-bcrypt
  1. Lancez l'application:
docker compose up --build -d
  1. Ouvrez l'application:
http://localhost:8888

En production, vérifiez que les variables SECRET_KEY, ADMIN_USERNAME et ADMIN_PASSWORD_HASH sont injectées dans le conteneur au runtime. Si ADMIN_PASSWORD_HASH est absent, l'application génère un hash pour le mot de passe par défaut admin123, ce qui ne doit pas être utilisé en production.

Configuration

Variable Défaut Description
DB_PATH /srv/sqlite/ma_base.sqlite Chemin vers la base SQLite.
IMAGES_DIR /data/images dans Docker Dossier de stockage des pochettes.
SECRET_KEY please-change-me dans Docker Clé de session Flask. A changer impérativement.
ADMIN_USERNAME admin Identifiant administrateur.
ADMIN_PASSWORD_HASH vide Hash bcrypt du mot de passe administrateur.
SPOTIFY_CLIENT_ID vide Client ID Spotify, optionnel.
SPOTIFY_CLIENT_SECRET vide Client Secret Spotify, optionnel.

Le fichier docker-compose.yml monte:

volumes:
  - /srv/sqlite:/srv/sqlite:Z
  - /srv/retrofy_images:/data/images:Z

La base doit être accessible en écriture si vous utilisez l'édition des fiches depuis l'interface administrateur.

Base de données attendue

Retrofy lit principalement les tables suivantes:

  • records: catalogue principal des disques.
  • record_images: association entre un disque et une image de pochette.
  • artistes: informations complémentaires d'artiste, notamment le texte a_propos.

Les champs utilisés dans records incluent notamment id, artist, album_title, year, label, catalog_number, format, country, barcode, matrix_runout, genre, style, media_condition, sleeve_condition, location, quantity, notes, price, currency, source, acquired_date, purchase_price, created_at, updated_at, artiste_id, storage et discogsid.

Administration

La connexion administrateur se fait depuis /login.

Une fois connecté, l'administrateur peut:

  • téléverser une pochette;
  • demander une recherche automatique de pochette;
  • modifier certains champs d'une fiche disque.

Les champs éditables sont volontairement limités par liste blanche côté serveur afin d'éviter l'injection de noms de colonnes dans les requêtes SQL.

Spotify

L'intégration Spotify est optionnelle. Lorsque SPOTIFY_CLIENT_ID et SPOTIFY_CLIENT_SECRET sont configurés, Retrofy recherche automatiquement l'album affiché sur Spotify et ajoute un lecteur intégré si une correspondance est trouvée.

Voir SPOTIFY_SETUP.md pour le guide complet.

Pochettes et favicons

Les pochettes sont servies via:

/covers/<filename>

Les favicons sont servis via:

/favicon/<filename>

Placez les fichiers favicon dans le dossier monté vers /data/images, par exemple /srv/retrofy_images sur l'hôte:

  • favicon.ico
  • favicon-16x16.png
  • favicon-32x32.png
  • apple-touch-icon.png
  • android-chrome-192x192.png
  • android-chrome-512x512.png

Exports

La page inventaire permet d'exporter les résultats filtrés en:

  • JSON
  • CSV

Les exports sont aussi accessibles depuis /export?format=json ou /export?format=csv, avec les mêmes paramètres de filtre que l'inventaire.

Scripts de vérification

Le dépôt contient plusieurs scripts de vérification autonomes:

python test_security.py
python test_sql_injection_fix.py
python test_random_covers.py
python test_spotify_integration.py
python test_favicon.py
python test_favicon_access.py

Ces scripts ne constituent pas une suite pytest complète; ils valident des points ciblés comme le hachage bcrypt, la protection SQL, les pochettes aléatoires, l'intégration Spotify et les favicons.

Structure du projet

.
├── app.py                  # Application Flask et routes
├── templates/              # Pages Jinja
├── static/styles.css       # Styles de l'interface
├── Dockerfile              # Image Python Flask
├── docker-compose.yml      # Déploiement local/serveur
├── env.example             # Exemple de configuration
├── generate_password.py    # Générateur de hash bcrypt
├── SPOTIFY_SETUP.md        # Guide Spotify
└── test_*.py               # Scripts de vérification

Sécurité

  • Ne gardez jamais le mot de passe par défaut en production.
  • Utilisez une valeur longue et aléatoire pour SECRET_KEY.
  • Injectez les secrets au runtime plutôt que de les commiter dans le dépôt.
  • Gardez le volume SQLite protégé: il contient les données éditées depuis l'interface.
  • L'upload de pochettes est réservé aux sessions administrateur.

Licence

Aucune licence n'est actuellement déclarée dans le dépôt. Ajoutez un fichier LICENSE si vous souhaitez préciser les conditions d'utilisation ou de contribution.

About

Flask/Docker app for browsing, managing, and enriching a SQLite-backed vinyl record collection with cover art lookup, inventory exports, admin edits, and optional Spotify embeds.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors