Files
pmomusic/pmoqobuz/test_python_qobuz/COMPARISON_GUIDE.md

4.4 KiB

Guide de comparaison Python vs Rust

Objectif

Comparer exactement ce que Python envoie vs ce que Rust envoie lors de l'appel à track/getFileUrl.

Étape 1: Tester Python avec le fake server

Terminal 1 - Démarrer le fake server:

cd pmoqobuz/test_python_qobuz
python3 fake_qobuz_server.py

Laissez ce terminal ouvert. Il affichera tous les détails des requêtes.

Terminal 2 - Tester Python:

cd pmoqobuz/test_python_qobuz

# Patcher pour utiliser localhost
python3 patch_for_fake.py

# Lancer le test simplifié
python3 test_getfileurl.py

Entrer vos credentials:

  • Username: eric@coissac.eu (ou Entrée)
  • Password: votre mot de passe

Terminal 1 - OBSERVER:

Le serveur affichera 2 requêtes:

  1. POST /api.json/0.2/user/login - Login (pas de signature)
  2. POST /api.json/0.2/track/getFileUrl - ⚠️ C'EST CELLE-CI QU'ON VEUT!

Pour la requête track/getFileUrl, notez EXACTEMENT:

Headers:
  X-App-Id: ???
  X-User-Auth-Token: ???
  Content-Type: ???
  Content-Length: ???

Body (Form Data):
  track_id: ???
  format_id: ???
  intent: ???
  request_ts: ???  ← FORMAT DU TIMESTAMP
  request_sig: ??? ← SIGNATURE MD5

IMPORTANT: Copiez/collez ou prenez une capture d'écran de cette requête!

Terminal 2 - Restaurer:

python3 patch_for_fake.py restore

Étape 2: Tester Rust avec le fake server

Terminal 1 - Fake server toujours actif

Terminal 2 - Modifier temporairement le code Rust:

Éditer pmoqobuz/src/api/mod.rs ligne ~32:

// AVANT:
const API_BASE_URL: &str = "https://www.qobuz.com/api.json/0.2";

// APRÈS (temporaire!):
const API_BASE_URL: &str = "http://localhost:8080/api.json/0.2";

Terminal 2 - Compiler et lancer:

cd pmoqobuz
cargo build --example lazy_loading
cargo run --example lazy_loading

Terminal 1 - OBSERVER:

Cherchez la requête POST /api.json/0.2/track/getFileUrl

Notez les mêmes détails que pour Python:

Headers:
  X-App-Id: ???
  X-User-Auth-Token: ???
  Content-Type: ???
  Content-Length: ???

Body (Form Data):
  track_id: ???
  format_id: ???
  intent: ???
  request_ts: ???  ← FORMAT DU TIMESTAMP
  request_sig: ??? ← SIGNATURE MD5

Terminal 2 - Restaurer le code Rust:

Remettre l'URL originale:

const API_BASE_URL: &str = "https://www.qobuz.com/api.json/0.2";

Étape 3: Comparer

Placez les deux requêtes côte à côte et cherchez les différences:

Différences possibles:

  1. Ordre des paramètres dans le form data
  2. Format du timestamp (nombre de décimales?)
  3. Signature MD5 (devrait être différente car timestamp différent)
  4. Headers manquants (Content-Type?)
  5. Valeurs des headers (X-App-Id différent?)
  6. Encoding du form data

Ce qu'on DOIT voir identique:

  • Méthode: POST (pas GET)
  • Headers X-App-Id et X-User-Auth-Token présents
  • Paramètres: track_id, format_id, intent, request_ts, request_sig
  • Content-Type: application/x-www-form-urlencoded

Ce qui PEUT être différent:

  • Valeur de request_ts (timestamp différent)
  • Valeur de request_sig (car timestamp différent)
  • Ordre des paramètres (si ça n'affecte pas la signature)

Ce qui NE DOIT PAS être différent:

  • Format du timestamp (même nombre de décimales)
  • Type de requête (POST)
  • Présence de tous les headers requis

Exemple de comparaison

Python (référence):

POST /api.json/0.2/track/getFileUrl

Headers:
  X-App-Id: 798273057
  X-User-Auth-Token: NAP_hlSUqU...
  Content-Type: application/x-www-form-urlencoded
  Content-Length: 156

Body:
  track_id=19557883&format_id=27&intent=stream&request_ts=1734170123.456789&request_sig=abc123def456...

Rust (à corriger):

POST /api.json/0.2/track/getFileUrl

Headers:
  X-App-Id: 798273057
  X-User-Auth-Token: NAP_hlSUqU...
  Content-Type: application/x-www-form-urlencoded
  Content-Length: 156

Body:
  track_id=19557883&format_id=27&intent=stream&request_ts=1734170123.45678&request_sig=xyz789abc012...
                                                                        ^
                                                                  Une décimale en moins?

Notes

  • Le fake server log TOUT, donc vous verrez aussi les requêtes de login
  • Concentrez-vous sur la requête /track/getFileUrl qui nécessite une signature
  • Prenez des captures d'écran ou copiez les logs pour comparaison facile