196 lines
4.4 KiB
Markdown
196 lines
4.4 KiB
Markdown
|
|
# 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:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
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:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
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:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
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:
|
||
|
|
|
||
|
|
```rust
|
||
|
|
// 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:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
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:
|
||
|
|
|
||
|
|
```rust
|
||
|
|
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
|