POC – Synchronisation Discogs vers WooCommerce

Demo : http://store.borninthe80s.fr

Script pour aller chercher les informations de la collection via Discogs via l’API Python et les ajouter ensuite dans WooCOmmerce.

Ce script permet de synchroniser les listings de Discogs avec une boutique WooCommerce. Il gère plusieurs cas pour ajouter ou mettre à jour les produits.

Fonctionnalités principales

  • Connexion à l’API Discogs pour récupérer les listings en vente.
  • Connexion à l’API WooCommerce pour ajouter ou mettre à jour les produits.
  • Gestion des stocks activée sur WooCommerce.
  • Ajout ou mise à jour des attributs spécifiques aux produits :
    • Artiste
    • Format
    • Genre
    • Label
    • Pays
    • Sortie
    • Style
    • URLPHOTO_Discogs (URL de la photo sur Discogs, invisible)
    • URL_Discogs (URL de la fiche Discogs, invisible)
    • ID_Discogs (ID Discogs, invisible)

Fonctionnement

Étape 1 : Récupération des listings Discogs

Le script :

  1. Se connecte à l’API Discogs en utilisant un token d’authentification.
  2. Récupère tous les listings marqués “For Sale”.
  3. Ignore les listings qui ne sont pas en vente.

Étape 2 : Préparation des données

Pour chaque disque en vente, le script :

  1. Construit un titre au format : Artiste – Titre.
  2. Ajoute une description détaillée avec des informations comme :
    • Label
    • Format
    • Pays
    • Année de sortie
    • Genre
    • Style
  3. Prépare les attributs WooCommerce.

Étape 3 : Vérification de l’existence dans WooCommerce

Pour chaque disque, le script vérifie s’il existe déjà dans WooCommerce en utilisant le champ SKU (ID Discogs) :

  1. Cas 1 : Le produit n’existe pas dans WooCommerce

→ Le produit est ajouté avec un stock initial de 1.

  1. Cas 2 : Le produit existe et son stock est égal à 1

→ Aucune action n’est effectuée.

  1. Cas 3 : Le produit existe mais son stock est à 0

→ Le stock est remis à 1.

Étape 4 : Gestion des stocks

Lors de la mise à jour ou de l’ajout des produits :

  1. La gestion des stocks est activée.
  2. Le stock initial est défini à 1.

Pré-requis

  • Une clé API Discogs valide.
  • Une configuration correcte de WooCommerce (URL, Consumer Key, Consumer Secret).
  • Les attributs correspondants doivent exister dans WooCommerce (par exemple, “Artiste”, “Format”).

Logs

Le script affiche des messages pour chaque étape :

  1. Succès lors de l’ajout ou de la mise à jour des produits.
  2. Erreurs éventuelles lors des appels aux API.

Cas d’utilisation

Ce script est idéal pour les utilisateurs qui souhaitent :

  1. Synchroniser automatiquement leur inventaire Discogs avec WooCommerce.
  2. Garder leur stock à jour en fonction des ventes ou de l’ajout de nouveaux disques.

Limites

  1. Les erreurs de connexion aux API ou les mauvais formats de données ne sont pas automatiquement corrigés.
  2. Les catégories WooCommerce doivent être configurées manuellement avant l’exécution.

Améliorations possibles

  1. Ajouter des fichiers de logs pour un suivi détaillé.
  2. Gérer les erreurs de mise à jour des stocks de manière plus robuste.

Code

import discogs_client
import csv
import time
import requests # Pour télécharger les photos
from datetime import datetime
import os
from woocommerce import API

# Configuration WooCommerce
wcapi = API(
url="https://store.borninthe80s.fr", # Remplacez par l'URL correcte
consumer_key="montoken",
consumer_secret="montoken",
version="wc/v3",
timeout=30
)

# Authentification Discogs
TOKEN = 'montoken'
client = discogs_client.Client('DiscogsPrestashopApp/1.0', user_token=TOKEN)

def get_product_by_sku(sku):
try:
response = wcapi.get(f"products?sku={sku}")
if response.status_code == 200:
products = response.json()
return products[0] if products else None
else:
print(f"Erreur lors de la recherche du produit SKU {sku} : {response.status_code}")
return None
except Exception as e:
print(f"Erreur lors de la récupération du produit SKU {sku} : {e}")
return None

def update_stock(product_id, quantity):
try:
print(f"Mise à jour du stock pour le produit ID {product_id} à {quantity}")
data = {"stock_quantity": quantity, "manage_stock": True}
response = wcapi.put(f"products/{product_id}", data)
if response.status_code == 200:
print(f"Stock mis à jour avec succès pour le produit ID {product_id}")
else:
print(f"Erreur lors de la mise à jour du stock pour le produit ID {product_id} : {response.status_code}")
except Exception as e:
print(f"Erreur lors de la mise à jour du stock pour le produit ID {product_id} : {e}")

def ajouter_produit_woocommerce(product):
try:
print(f"Ajout du produit dans WooCommerce : {product['name']}")
response = wcapi.post("products", product)
if response.status_code == 201: # Produit créé
print(f"Produit ajouté avec succès : {response.json()['name']}")
else:
print(f"Erreur WooCommerce : {response.status_code} - {response.json()}")
except Exception as e:
print(f"Erreur lors de l'ajout du produit : {e}")

# Récupérer les listings de Discogs
try:
print("Connexion à l'API Discogs...")
user = client.identity()
print(f"Connecté en tant que : {user.username}")

print("Récupération des listings en vente depuis Discogs...")
listings = client.user(user.username).inventory
print(f"Nombre total de listings récupérés : {len(listings)}")

for i, listing in enumerate(listings):
print(f"Traitement du listing {i + 1}/{len(listings)}")
if listing.status != 'For Sale':
print(f"Listing ignoré (statut non 'For Sale') : {listing.release.title}")
continue

release = listing.release
artists = ", ".join([artist.name for artist in release.artists])
formats = ", ".join([
format['name'] + (", " + ", ".join(format.get('descriptions', [])) if 'descriptions' in format else "")
for format in release.formats
])
styles = ", ".join(release.styles or [])
labels = ", ".join([label.name for label in release.labels])
label_catalog_numbers = ", ".join(
[label.data['catno'] for label in release.labels if 'catno' in label.data and label.data['catno']]
)
photo_url = release.images[0]['uri'] if release.images else None
discogs_url = release.data.get('uri', 'URL non disponible')

# Préparer les données du produit pour WooCommerce
description_prefix = (
f"Label: {labels}\n"
f"Format: {formats}\n"
f"Pays: {release.country}\n"
f"Sortie: {release.year}\n"
f"Genre: {', '.join(release.genres or [])}\n"
f"Style: {styles}\n\n"
)

product_data = {
"name": f"{artists} - {release.title}",
"type": "simple",
"regular_price": str(listing.price.value),
"description": description_prefix + (listing.comments or ""),
"categories": [{"id": 15}], # Remplacez par une catégorie valide
"images": [{"src": photo_url}] if photo_url else [],
"sku": str(listing.id), # Ajouter l'ID Discogs dans le champ UGS
"manage_stock": True, # Activer la gestion des stocks
"stock_quantity": 1, # Définir le stock initial à 1
"attributes": [
{"name": "Artiste", "visible": True, "options": [artists]},
{"name": "Format", "visible": True, "options": [formats]},
{"name": "Genre", "visible": True, "options": [', '.join(release.genres or [])]},
{"name": "Label", "visible": True, "options": [labels]},
{"name": "Pays", "visible": True, "options": [release.country]},
{"name": "Sortie", "visible": True, "options": [str(release.year)]},
{"name": "Style", "visible": True, "options": [styles]},
{"name": "URLPHOTO_Discogs", "visible": False, "options": [photo_url] if photo_url else ["Aucune photo"]},
{"name": "URL_Discogs", "visible": False, "options": [discogs_url]},
{"name": "ID_Discogs", "visible": False, "options": [str(listing.id)]}
]
}

# Vérifier si le produit existe déjà dans WooCommerce
existing_product = get_product_by_sku(product_data['sku'])
if existing_product:
stock_quantity = existing_product.get('stock_quantity', 0)
if stock_quantity == 1:
print(f"Le produit {existing_product['name']} existe déjà avec un stock de 1, aucune action nécessaire.")
elif stock_quantity == 0:
update_stock(existing_product['id'], 1)
else:
print(f"Le produit {existing_product['name']} a un stock inattendu ({stock_quantity}), vérifiez manuellement.")
else:
ajouter_produit_woocommerce(product_data)

print("Traitement des listings terminé.")

except Exception as e:
print(f"Erreur : {e}")