Jouons avec l'API de IMEEM.com
Monday, 29. December 2008, 11:26:00
Introduction
Il y a quelques temps, je m'étonnais que mon script permettant de lire ma musique depuis Anywhere.FM ne fonctionnait plus, pensant qu'il sagissait de changements dans l'API du site.
En réalité la cause s'est avérée être le rachat de Anywhere.FM par le site "musico-social" Imeem.com.
Lors de ma dernière connexion sur l'ancien site, on m'ademandé obligé d'effectuer la transition des musiques vers Imeem.com. Une barre de status en Flash (bien évidemment) semblait affirmer que la migration se déroulait parfaitement... seulement leur outil m'a perdu les 9/10ème de ma collection
Déjà que les anciens scripts n'ont plus d'utilité, je l'ai senti passer (il m'avait bien fallu un mois pour tout uploader)
Décu mais pas désespéré pour autant, j'ai profité du fait qu'une vrai API soit disponible pour Imeem.com (contrairement à Anywhere.FM que j'avais du étudier moi-même sous toutes les coutures) pour coder un petit programme d'upload et peut-être à venir un nouveau player
L'API
Les bons points de l'API d'Imeem, c'est que l'on est pas obligé de manipuler cet affreux AMF propriétaire
On peut communiquer au format XML ou Json pour lequel j'ai opté.
Communiquer avec les serveurs s'avère beaucoup plus simple, en revanche différentes protections sont présentes, comme la nécessité de disposer d'une clé d'API fournie par le site et de la communiquer à chaque appel de fonction. Anywhere.FM n'était aucunement documenté mais aucune protection n'était vraiment présente.
Les méthodes proposées par l'API donnent un goût de déjà vu : on se connecte (usersLogin), on récupère son ID (usersGetCurrentUser), on demande les IDs de nos listes de lecture (playlistsGetByUser), on en extrait les IDs des musiques (mediaGetByPlaylist) et on obtient au final une adresse où lire le titre (mediaGetInfo).
Le problème c'est que ces adresses sont destinées à être lues depuis un navigateur car il ne s'agit pas de lien direct vers un flux. Sans compter que ces urls permettent de lire le titre seul et qu'à côté de ça le Flash permettant de jouer toute une playlist ne fonctionne pas (les joies de Flash...)
Enfin bref, le site est à chier et plus vite je pourrais communiquer directement avec les serveurs mieux ce sera
La lecture des flux
Seulement la lecture des flux risquent de poser problème.
D'abord ce n'est plus de mp3 mais du flv (beurk). Ensuite ça passe par une méthode non documentée (ce serait trop beau) nommée "mediaGetStreamInfo" qui prend comme argument :
Cette merveilleuse fonction recrache trois paramêtres :
Ces trois paramêtres sont traitées dans notre navigateur par l'animation Flash du site (audio_player3.swf) qui nous recrache une URL valide vers un flv.
Il faudrait donc parvenir à extraire l'Action Script du Flash pour trouver l'algorithme permettant de récupérer une adresse de flux valide.
Si vous en avez le courage, toute aide sera la bienvenue ;-)
L'upload
Pour ce qui est de l'upload, le problème est réglé. L'API permet deux possibilitées, les temps passent par la page http://upload.imeem.com/apiupload.aspx :
Dans les deux cas, la page répond (si la requête est bien formatée) par un XML qui donne le code d'erreur correspondant (0 en cas de succès).
Certains auront déjà pensé aux possibilités offertent par la première méthode (transformer le serveur d'Imeem en outil de scan de ports etc
) mais ce n'est pas le sujet de l'article.
J'ai implémenté les deux méthodes d'upload, la méthode traditionnelle me semble un peu plus rapide. J'ai développé un outil en ligne de commande qui prend un répertoire en argument et upload tous les mp3s trouvés dans l'arborescence
Dans cette archive vous trouverez ma petite implémentation de l'API d'Imeem en Python, une librairie pour l'upload de fichier en HTTP (trouvée sur VoidSpace, légérement retouchée), l'uploader en ligne de commande ainsi qu'une capture au format pcap qui montre comment on arrive à la lecture d'un flux FLV en partant d'une adresse récupérée par mediaGetInfo (reste à savoir comment l'adresse du flux est calculée côté client).
Il y a quelques temps, je m'étonnais que mon script permettant de lire ma musique depuis Anywhere.FM ne fonctionnait plus, pensant qu'il sagissait de changements dans l'API du site.En réalité la cause s'est avérée être le rachat de Anywhere.FM par le site "musico-social" Imeem.com.
Lors de ma dernière connexion sur l'ancien site, on m'a
Déjà que les anciens scripts n'ont plus d'utilité, je l'ai senti passer (il m'avait bien fallu un mois pour tout uploader)
Décu mais pas désespéré pour autant, j'ai profité du fait qu'une vrai API soit disponible pour Imeem.com (contrairement à Anywhere.FM que j'avais du étudier moi-même sous toutes les coutures) pour coder un petit programme d'upload et peut-être à venir un nouveau player
L'API
Les bons points de l'API d'Imeem, c'est que l'on est pas obligé de manipuler cet affreux AMF propriétaire
Communiquer avec les serveurs s'avère beaucoup plus simple, en revanche différentes protections sont présentes, comme la nécessité de disposer d'une clé d'API fournie par le site et de la communiquer à chaque appel de fonction. Anywhere.FM n'était aucunement documenté mais aucune protection n'était vraiment présente.
Les méthodes proposées par l'API donnent un goût de déjà vu : on se connecte (usersLogin), on récupère son ID (usersGetCurrentUser), on demande les IDs de nos listes de lecture (playlistsGetByUser), on en extrait les IDs des musiques (mediaGetByPlaylist) et on obtient au final une adresse où lire le titre (mediaGetInfo).
Le problème c'est que ces adresses sont destinées à être lues depuis un navigateur car il ne s'agit pas de lien direct vers un flux. Sans compter que ces urls permettent de lire le titre seul et qu'à côté de ça le Flash permettant de jouer toute une playlist ne fonctionne pas (les joies de Flash...)
Enfin bref, le site est à chier et plus vite je pourrais communiquer directement avec les serveurs mieux ce sera
La lecture des flux
Seulement la lecture des flux risquent de poser problème.D'abord ce n'est plus de mp3 mais du flv (beurk). Ensuite ça passe par une méthode non documentée (ce serait trop beau) nommée "mediaGetStreamInfo" qui prend comme argument :
-
key : l'ID du média concerné
-
forceSample : un booléen (mettre à false)
-
isEmbed : booléen (false)
-
isFeatured : booléen (false)
-
methodVersion : nombre (à fixer à 2)
-
referrer : chaine, à fixer à "web"
-
supportsHD : booléen (probablement selon vos goûts)
Cette merveilleuse fonction recrache trois paramêtres :
-
h : le nom du serveur où se trouve le flv (par exemple "srv0202-01.sjc3.imeem.com")
-
p : un path qui semble fixe à chaque média (ex: "/g/m/5352700b33c7347ae3342390187a7fa4.flv") mais inexploitable directement
-
ep : une chaine de cracatère très longue qui fait penser à du base64
Ces trois paramêtres sont traitées dans notre navigateur par l'animation Flash du site (audio_player3.swf) qui nous recrache une URL valide vers un flv.
Il faudrait donc parvenir à extraire l'Action Script du Flash pour trouver l'algorithme permettant de récupérer une adresse de flux valide.
Si vous en avez le courage, toute aide sera la bienvenue ;-)
L'upload
Pour ce qui est de l'upload, le problème est réglé. L'API permet deux possibilitées, les temps passent par la page http://upload.imeem.com/apiupload.aspx :
- Upload depuis une URL : on envoit des données en spécifiant où une des machines de Imeem doit aller chercher le fichier mp3
- Upload par HTTP Post : un upload "classique" où il fait bien prendre soin au formatage des données.
Dans les deux cas, la page répond (si la requête est bien formatée) par un XML qui donne le code d'erreur correspondant (0 en cas de succès).
Certains auront déjà pensé aux possibilités offertent par la première méthode (transformer le serveur d'Imeem en outil de scan de ports etc
J'ai implémenté les deux méthodes d'upload, la méthode traditionnelle me semble un peu plus rapide. J'ai développé un outil en ligne de commande qui prend un répertoire en argument et upload tous les mp3s trouvés dans l'arborescence
Dans cette archive vous trouverez ma petite implémentation de l'API d'Imeem en Python, une librairie pour l'upload de fichier en HTTP (trouvée sur VoidSpace, légérement retouchée), l'uploader en ligne de commande ainsi qu'une capture au format pcap qui montre comment on arrive à la lecture d'un flux FLV en partant d'une adresse récupérée par mediaGetInfo (reste à savoir comment l'adresse du flux est calculée côté client).






