Skip to content

Ingest Magic the Gathering ​

Comment Magic a été branché sur le pipeline scan le 2026-05-07.

TL;DR ​

  • Source de données : Scryfall, bulk-data default_cards (toutes les éditions, ~85 k cartes physiques après filtrage des cartes digital-only MTGO/Arena).
  • Aucune migration nécessaire — le schéma multi-TCG (cards.tcg, cards.base_id, cards.variant) ajouté pour One Piece accueille MTG sans changement.
  • MTG ne passe pas par tcg-vision (Tormknd n'a pas d'index FAISS pour Magic) — les scans MTG résolvent via /scan-lab (notre pipeline pgvector + DINOv2).
  • Throughput observé : ~213 cartes/seconde côté ingest (download CDN Scryfall en concurrence 12), ~9 cartes/seconde côté embedding (DINOv2 small CPU).

Comment lancer l'ingest ​

bash
# Catalogue complet (default-cards Scryfall, ~85 k cartes, ~13 GB d'images)
docker compose --env-file .env -f docker/compose.yml run --rm \
  -e INGEST_TCG=mtg ingest

# Un seul set (smoke test — Limited Edition Alpha = 295 cartes / ~80 MB)
docker compose --env-file .env -f docker/compose.yml run --rm \
  -e INGEST_TCG=mtg -e INGEST_SETS=lea ingest

# Smaller alternative — `unique_artwork` (1 ligne par illustration, ~57 k)
docker compose --env-file .env -f docker/compose.yml run --rm \
  -e INGEST_TCG=mtg -e INGEST_MTG_BULK=unique_artwork ingest

Puis pour peupler les embeddings :

bash
docker compose --env-file .env -f docker/compose.yml run --rm \
  --entrypoint "node dist/embedCatalogLab.js" \
  -e INGEST_LAB_TCG=mtg ingest

Variants MTG (vs One Piece) ​

Contrairement à OPTCG (qui retourne plusieurs entrées partageant le même card_set_id pour les arts parallèles), Scryfall dé-duplique déjà les éditions via des collector_number distincts au sein d'un même set. Donc pas besoin de assignVariantIds côté Magic — chaque ligne Scryfall est déjà une édition unique avec son propre id PK.

Le seul cas qui génère plusieurs lignes pour une même carte physique : les double-faced cards (transform / mdfc). Le recto reçoit l'id de base ; le verso reçoit ${baseId}_back avec variant='back'. Les deux faces sont indexées indépendamment dans card_embeddings_lab parce qu'elles sont scannables séparément.

Pourquoi pas tcg-vision ? ​

tcg-vision (le sidecar de Tormknd) embarque un index FAISS pré-calculé qui couvre Pokémon (~26 k) + One Piece (~4 k) + un peu de Lorcana. Magic n'en fait pas partie. Deux options :

  1. Demander à Tormknd de l'ajouter à son tgc-app et rebuild son index FAISS — pas de code de notre côté, mais on dépend de son rythme.
  2. Utiliser notre pipeline pgvector — ingest via Scryfall, embed avec notre sidecar embeddings:, query via /scan-lab. Aucune dépendance externe, mais c'est la première vraie utilisation prod du chemin pgvector.

On a pris l'option 2 parce que (a) on voulait de toute façon valider notre pipeline pour s'affranchir de Tormknd à terme, et (b) MTG est l'occasion idéale — c'est un TCG complet qui n'existe nulle part ailleurs côté backend.

Voir aussi ​