Skip navigation.

devloop :: blog

Blog sur la sécurité informatique, la programmation, Linux et le Web

Posts tagged with "mp3"

Anywhere.FM Python CLI Player

, , , ...

C'est après pas mal de recherches et de tests de code que je suis finalement parvenu à développer en Python un lecteur de ma musique présente sur le site Anywhere.FM :smile:

Le dernier bug rencontré était, comme expliqué dans un précédent, le décodage de certaines chaines de caractères qui ne respectaient pas le format UTF-8. Le responsable était finalement le site lui-même ou plutôt les utilisateurs qui envoit des données au serveur à l'aide d'un navigateur utilisant un autre encodage.

Ainsi dans mon cas, le décodage de mon profil échouait car dans les données retournées se trouvait entre autres le nom mal encodé Ted Gärdestad correspondant à l'un des artistes les plus écoutés par une personne dans ma liste d'amis (la fonctione RPC get_complete_profiles du site renvoie beaucoup d'infos superflues :-| )

Pour résoudre ce souci il fallait intervenir sur la méthode readString de la classe Decoder de PyAMF (module amf3).
Comme je ne voulais pas et d'ailleurs ne pouvais pas modifier le code de PyAMF (installé sous forme de "egg" sur mon système), j'ai plutôt imaginé une technique de "Python API Hooking".
En fait il s'agit simplement de la redéfinition puis d'un écrasement d'une méthode d'une classe Python... mais avouez que dit comme ça, ça en jette beaucoup moins p:

La vérification ajoutée à la méthode readString consistait à lever une exception si le passage en unicode échouait et dans ce cas, à remplacer les mauvais caractères par des underscore. Ce qui donnait :
from pyamf.amf3 import Decoder
from string import maketrans

in_string="".join([chr(i) for i in range(126,256)])
out_string="_"*130
trans=maketrans(in_string,out_string)

def my_readString(object, use_references=True):
  def readLength():
      x = object.readUnsignedInteger()

      return (x >> 1, x & 1 == 0)

  length, is_reference = readLength()

  if use_references and is_reference:
      return object.context.getString(length)

  buf = object.stream.read(length)

  try:
    result = unicode(buf, "utf8")
  except UnicodeDecodeError:
    buf=buf.translate(trans)
    result = unicode(buf, "utf8")

  if len(result) != 0 and use_references:
      object.context.addString(result)

  return result

sav_readString=Decoder.readString
Decoder.readString=my_readString

L'opération de récupération et de correction de la liste de lecture "Entire Library" pouvant prendre un certain temps si la liste de lecture est importante, j'ai préféré diviser le programme en deux : le premier code récupère la liste de lecture et l'enregistre sous forme d'une liste Python dans un fichier ; le second est le lecteur qui charge la liste de lecture et va lire de façon aléatoire et unique un titre de la bibliothèque :smile:
Au final on gagne largement en charge réseau et en temps d'accès par rapport à l'utilisation du site Internet et on n'a pas à subir les utilisations mémoire et processeur gourmandes du plugin Flash p:

Vous avez donc get_library.py qui donne un résultat de ce style :
Connection on the server...
Connexion successfull!
user_id = 5418
Hooking the PyAMF Decoder
Getting the Entire Library playlist...
Library dumped!

qui génère un fichier library.py utilisé par le lecteur player.py qui joue les flux musicaux et donne un affichage dans ce genre :
Connecting on the server...
Connexion successfull
user_id = 5418
White America - Eminem ( The Eminem Show )
Troisième tour - Rapaces ( 2000 )
Les Poubelles du Coeur - Parabellum ( 1984-2004 )
Question de fun - Les Shériff ( La Saga Des Sheriff (disc 2) )
Alcohol - Dropkick Murphys ( Live On St. Patrick's Day )
Marilyn Moore - Sonic Youth ( Evol )
Come Back, Baby - Ramones ( The Chrysalis Years (disc 1) )
The Watcher - Dr. Dre ( 2001 )
...

La partie lecteur nécessite la présence de mplayer sur le système. Seul regret : on ne peut pas trop jouer sur l'interface de mplayer pour avoir quelque chose de moins verbeux et agréable... une simple barre de défilement de la lecture en cours (à l'instar de wget) m'aurait bien plu... mais c'est une autre histoire :smile:

Lire directement la musique de Anywhere.FM : ça marche (presque)

, , , ...

Suite de ma précédente étude du fonctionnement de Anywhere.FM.

Je me suis lancé aujourd'hui dans la "pratique" en écrivant quelques lignes de code et les résultats sont pour le moins encourageants :smile:
Je me suis orienté naturellement vers les modules urllib2 et cookielib de Python que j'avais utilisé pour Wapiti.

Les premières étapes se sont réalisées sans problème (envoies de données par GET ou POST, utilisation d'une "boîte à cookies" p: )
Pour la seconde étape j'avais le choix entre utiliser les capacitées de PyAMF à effectuer les requêtes mais en devant injecter mes entêtes HTTP ou rester sur l'utilisation du module urllib2 et injecter les données encodées à l'aide de PyAMF.
J'ai finalement opté pour la seconde méthode, même s'il m'a fallu un peu de temps pour comprendre quels arguments passer à quelles fonctions. Pour résumer j'utilise seulement les fonctionnalitées de création d'objet (plus propre) et d'encodeur/décodeur de PyAMF et toute la partie communication est réalisée par urllib2.

J'ai d'abord implémenté les étapes que j'avais observé au complet puis j'ai ensuite commenté certaines étapes dont l'utilité était douteuse.
Au final les réponses aux questions précédentes sont :
  • _unique_request_id_ est aléatoire. On peut même le définir nous même au début. Reprendre la même valeur à chaque nouvelle session ne semble pas poser de problème, même sur des intervalles de temps rapprochés. Je n'ai pas vérifié si on pouvait se passer de l'incrémentation d'une requête à une autre
  • Les fameuses variabes __qca et __qcb définies par le biais du Javascript sur le serveur quantserve semblent totalement superflues. Ne pas les utiliser n'entrave en rien la communication avec Anywhere.FM. De toute évidence elles sont utilisées uniquement à des fins de tracking
  • tracker_id n'a pas d'utilité, malgré qu'il soit explicitement défini (une requête est générée uniquement à cet effet). Il pourrait s'agir d'une fonctionnalitée que les administrateurs n'ont pas encore pû implémenté mais à venir ?!
  • Certains arguments passés à get_songs_for_user_playlists restent un mystère, toutefois on n'a pas besoin d'en savoir plus pour accèder à la librairie complète d'un utilisateur

Le code que vous pourrez trouver ici : PyAnywhereFM.py et sur pastebin.com n'est pas totalement fonctionnel.
En effet si on parvient bien à ouvrir une session sur le site, à effectuer des requêtes AMF et obtenir les résultats, on ne parvientpas pour le moment à décoder les réponses AMF à cause d'erreurs de décodage UTF-8. A l'heure actuelle je ne saurais pas dire si le problème vient de Anywhere.FM, de PyAMF ou encore de Python...

Il est tout de même possible d'obtenir un jeton valide pour accèder à un titre dont on connait par avance le "master_id" et le "song_ressource_id" (paramêtres qui sont fixes).
Le code tente de se connecter avec les identifiants présents dans la source (à vous d'y insérer les votres) ou fonctionnera avec l'utilisateur par défaut (démo, id = 89 comme vu la dernière fois) si les identifiants sont invalides. Il va ensuite lire un titre dans ma librairie à l'aide de mplayer.

Vous pouvez utiliser un sniffeur comme Wireshark pour comprendre ce qui se passe en fond lors de l'utilisation du script. Il faut noter toutefois que l'utilisateur "demo" a une librairie vide, c'est pour cela qu'il est possible de décommenter une ligne fixant le user_id à 46 (correspondant au compte "Free Music")

L'étape restante consiste donc à extraire les données des réponses AMF obtenues, ce qui ne devrait pas être trop difficile puisque le "master_id" et le "song_ressource_id" sont envoyés comme des chaines de caractères et non comme des entiers.
Tout cela montre qu'il est assez aisé (le code fait 129 lignes une fois les commentaires et les lignes vides retirées) de télécharger de la musique sur Anywhere.FM et malgré qu'il n'y ait pas de système permettant de rechercher un titre en particulier, il serait possible de générer une base de données des titres disponibles en récupérant les profils puis les listes de lecture des utilisateurs du site. Evidemment ça prendrait du temps, mais ce serait toujours plus rapide que de fouiller par le biais de l'interface web du site p:

Ecoutez votre musique aléatoirement pour pas un rond (ou presque) en mode console

, , , ...

L'astuce qui suit nécessite la présence d'un logiciel lisant le fichier qu'on lui passe en argument et quitte une fois arrivé à la fin du titre.
find /repertoire/vers/votre/musique/ -name "*.mp3" -print|sort -R|xargs -0 -d"\n" mplayer

La première commande fouille dans une arborescence les fichiers mp3 présents et génére une liste en affichant le chemon complet vers les fichiers.
La seconde commande va réorganiser cette liste de façon aléatoire :smile:
La dernière commande extrait chaque nom de fichier de la liste pour le passer en argument du lecteur audio (ici mplayer)

Fusionnez une image gif et un fichier mp3 !

, , , ...

Un développeur a trouvé le moyen de fusionner une image au format gif avec un fichier mp3...
Au final vous obtenez une image gif conforme et lisible avec n'importe quel visualisateur/navigateur etc et si vous passez cette même image dans un player mp3 vous obtenez... du son !!

Exemple : l'image disponible à l'adresse suivante fait 3 méga. Elle représente deux ordinateurs en train de s'échanger des données. Si vous la lancez dans votre lecteur favori (j'ai testé avec madplay pour l'occasion) vous entendrez un morceau de techno :sing:
http://www.cnahackers.com/test.gif

Le logiciel nommé mp3gif peut être utilisé par le web sur le site officiel
Une version .NET est apparemment disponible ici

Le fichier apparait comme étant une image gif (l'entête est celui du format gif) on pourrait donc utiliser le logiciel à des fins de stéganographie pour dissimuler des informations sonores :ninja:

Convertir des MPC en MP3 sous Linux

, , , ...

Logiciels nécessaires : lame, unzip, mppdec (à télécharger)

Vous venez de récupérer un album mais vous découvrez que les titres sont au format MPC que vous ne connaissez pas ?
On va voir comment convertir ces fichiers Musepack (extension .mpc) en fichiers .mp3...

D'après Wikipedia, Musepack est un codec de compression audio open-source qui offre des performances assez similaires au format Ogg.
Bien que les librairies MPC/Musepack soient open-source, ce n'est apparemment pas le cas des encoders et décodeurs de fichiers MPC, c'est pour cela que votre distribution ne vous les propose peut-être pas.

Pour commencer vous devez télécharger le binaire du décodeur disponible ici. Prenez la version liée dynamiquement.
Ensuite décompressez l'archive avec la commande "unzip mppdec-linux-libc6-1.95z2.zip" (adaptez en fonction de la version du logiciel) ou utilisez votre gestionnaire d'archives préféré (file-roller ou Ark par exemple). Vous devez bien sûr disposer de la commande unzip dans tous les cas.

Vous obtiendrez alors un binaire nommé "mppdec". Rendez le exécutable (chmod u+x mppdec en console) puis placez le dans un répertoire de votre path (/usr/bin/ ou ~/bin/ s'il existe).
Vous pouvez appeler l'exécutable sans option pour vérifier qu'il se trouve dans votre path.

Placez vous maintenant dans votre répertoire où se trouvent les fichiers mpc. Attention, une fois les fichiers convertis en mp3, les fichiers mpc et wav du répertoire seront effacés. Il est préférable que le dossier ne contienne que les fichiers à décoder.
Tappez les commandes :
for a in *.mpc; do n=`echo $a| cut -d. -f1`.wav;mppdec "$a" "$n";done
for a in *.wav; do n=`echo $a| cut -d. -f1`.mp3;lame -h "$a" "$n";done
rm *.mpc *.wav


Ca y est, vos fichiers sont convertis en mp3 :smile:
Pensez à mettre à jour vos tags ID3 après.

Et un script perl proposé par un visiteur :
#!/usr/bin/perl -w
use strict;

foreach my $file (@ARGV) {
  next if ($file !~ /\.mpc$/i);
  my $base = $file; $base =~ s/\.mpc$//i;
  #utilisation de mppdec pour decoder le .mpc et de lame pour encoder en .mp3
  system "mppdec \"$file\" - | lame --preset fast standard - \"$base.mp3\"";
  #affichage du message de fin
  print "$base.wma converti en mp3.\n";
}

Mes stats

, , , ...

Voilà maintenant une semaine que j'ai installé le plugin BBClone pour DotClear qui me permet de savoir d'où viennent mes visiteurs, ce qui leur plait etc.
Au début j'ai eu l'impression que personne ne viendrait par le biais d'une recherche sur un moteur alors que ces spiders venaient régulièrement visiter mon site. Chose assez étonnante, Google semblait s'interdire la lecture de mon blog. Peut-être qu'il n'avait pas apprécié mon billet sur le résultat d'une requête étrange. Le moteur MSN avait lui référencé tous les billets de mon blog depuis bien longtemps.
Les quatres moteurs qui passent le plus régulièrement sont Google, MSN, Yahoo et Pompos.
Pompos c'est le spider de dir.com, un moteur de recherche signé Iliad. Et à moins que je me trompe Iliad c'est aussi Free.fr.
Assez loin dans le classement viennent s'ajouter Ask Jeeves et les moteurs de recherche pour blogs (Technorati, BlogsNow, Blogpulse, Blo.gs). Ces derniers ne viennent généralement pas d'eux même : c'est moi qui les "ping" pour les avertir que j'ai ajouté un nouveau billet (d'ailleurs il faut que je le fasse, j'ai posté un tas de billets ces derniers temps).

Passons maintenant aux navigateurs :
41.62% pour Firefox !! C'est énorme !!
17.92% pour Opéra !! Enorme aussi (je vous explique ça de suite)
17.92% pour Internet Explorer.. c'est pas énorme p:
13.29% pour des navigateurs inconnus

Déjà pourquoi autant de Firefox ? Tout simplement le blog parle beaucoup de Linux, des logiciels libres, de programmation... bref il attire pas mal de personnes qui ont une curiosité informatique ou tout simplement qui n'ont pas envie de mettre des sous dans la poche à crosoft. La seconde explication c'est évidemment le succès qu'a remporté Firefox au fûr et à mesure de son dévellopement.
Pourquoi Opéra est en seconde place ? Opéra fonctionne sur un bon nombre de plates formes et est un très bon navigateur... mais assez méconnu. Seulement c'est le navigateur que j'utilise. Quand je poste un billet, je regarde le résultat dans le blog, corrige les fautes, recharge la page et ainsi de suite... je génère ce qu'on appelle des "faux positifs". Donc la place d'Opéra dans le classement est faussée et devrait se trouver après Internet Explorer.

On trouve ensuite Mozilla, le navigateur AOL, Lynx (ouais cool :smile: ), Konqueror, Safari et Crazy Browser. Ce dernier a fait pas mal parlé de lui à une époque, il me semble qu'il avait gagné un prix pour son côté innovant. En tout cas si vous êtes sous Windows, que vous en avez marre d'IE, que vous n'aimez ni Firefox ni Opéra, alors Crazy Browser semble être une bonne alternative... en fait je suis prêt à parier que IE7 ressemblera beaucoup à Crazy Browser p:

Côté systèmes d'exploitation, Windows XP est premier avec 39.43%, suivi d'assez prêt par Linux avec 32.00% des visites. On trouve après Windows NT, 2000 et 98 puis Mac OS X et FreeBSD.

Les visiteurs viennent en très grand majorité de pays francophones (France, Suisse, Belgique, canada, Luxembourg) ou des Etats-Unis (BBClone considère les extensions .com comme venant automatiquement des Etats-unis, donc là encore à prendre avec du recul).

Maintenant on passe aux sites d'où viennent mes visiteurs...
En première place on trouve Alionet.org, la communauté française pour la distribution SuSE. J'y suis inscrit depuis un bon boût de temps maintenant et j'y passe toujours même si j'ai migré sous Ubuntu. Le forum est très chalereux, je vous le recommande :wink:
Les gens viennent ensuite surtout de chez e-Idole : http://zebusoif.free.fr/ (le nom est définitif ? :D )
On trouve alors le blog de Chamaeleo (salut !! :wink: ). Passez le voir !
Le reste c'est assez explosé : forums, annuaires, moteurs de recherches...


Et maintenant le plus intéressant : les recheches que vous faites pour venir chez moi. Pour ne pas géner les personnes qu'une recherche aménerait sur cette page je vous redirigerais sur de bons liens :wink:

La recherche numéro 1 concerne l'utilisation de la webcam Quickcam Express de Logitech sous Ubuntu.
J'en parlais ici. Mais je vous recommande plutôt de faire une recherche sur le forum français d'Ubuntu : http://forum.ubuntu-fr.org/

Les autres recherches sont loin d'être régulières (je vous dirais ça une autre fois). Toutefois on remarque deux recherches sur Fumuj. Rendez-vous sur leur site officiel.

Toujours côté musique il y a des recherches sur Les Malpolis, "Kicking Ahead mp3" (passez plutôt chez e-Idole dans les liens à droite et écoutez sa webradio), "Beatles loop" (passez aux Punkles plutôt).
"svinkels parole de la chanson happy hour" : premier chose que je veux dire c'est que Google ne prend pas en compte les mots génériques dans les recherches dont inutile de mettre "de" ou "la". Sinon vous pouvez trouvez les paroles dans cette page
"Hey Jude" : il fallait en vouloir pour tomber sur mon site là :eyes:
"Emile Pylas" : ah un connaisseur :wink: Ecoute mon grand, le site officiel est ici. Et il a même ajouté des mp3 . Comme ça tu auras le plaisir de faire du bien à tes oreilles et de faire chier Pascal Nègre :D . Sinon passe sur ma webradio (menu à droite)

Il y a pour finir des recherches sur "TéKiToi" (du voyeurisme ?), "thèmes incomplet firefox" (c'est balot), "Securitech 2005 difficile" (je veux bien le croire), "agvcc.exe" (...), "tests marrants" (si tu suis les liens un peu partout sur ce blog tu devrais être servi), "erreur segmentation wine ubuntu" (désolé je peux rien pour toi).

Voilà je vous redonne rendez-vous dans un bon boût de temps pour l'analyse de mes stats :wink:

De la musique pour ratatouiller le G8

, , ,

Des artistes se sont réunis pour faire une compile anti-G8... c'est l'occasion de télécharger du mp3 (ouaiiiis !!) de façon gratuite (ouaiiiiis !!) et légale (ah !) :D

Vous trouverez tout à partir de
La compile est un zip de 74Mo (ouille) qui contient 18 mp3s et un PDF... surtout de la chanson française.
Je connaissais déjà le titre d'Emile Pylas (qui était passé à Aucard de Tours)... pour les autres je découvre p:
J'avais déjà entendu parlé des Malpolis (pas si loin des VRP niveau musical) et je connais déjà Miss Helium (un groupe qui fait de la musique libre, par contre pas mon style :left: )

L'occasion de donner de la musique engagée à tes oreilles, toi le/la jeune ! :yes:

PS: pour les Linuxiens le serveur filtre wget alors utilisez l'option -U :wink:

Derniers logiciels testés

, , , ...

Je vais vous parler brièvement des derniers logiciels que j'ai installé sous Linux.

J'ai voulu essayer KTouch, un logiciel de dactylographie, pour apprendre à tapper avec tous mes doigts... Après plusieurs essais j'ai toujours pas compris comment ça marche... On a une image d'un clavier avec des touches de différentes couleurs et une phrase à tapper et retapper le plus vite possible. A part ça je n'ai rien vu qui explique clairement comment placer ses doigts sur le clavier... je cherche toujours...

KID3 est un éditeur de tag pour les fichiers MP3. Il supporte le format ID3v1 et le ID3v2. Très simple d'utilisation et très pratique... surtout que XMMS ne semble gérer qu'un seul format. Il n'y a que l'interface qui n'est pas très belle mais le logiciel marche très bien.

Gqcam est un des logiciels que j'ai testé pour ma webcam. Le seul défaut est que le logiciel a tendance à oublier les préférences que l'on a fixé lors de la dernière utilisation... Donc à chaque lancement il faut activer la correction RBG -> GBR (sinon les images sont bleues) et désactiver l'autoréglage de la luminosité (qui tourne en boucle).
Le logiciel permet de faire des captures au format jpg ou png. L'interface est ultra-simple à utiliser... c'est pour l'instant le logiciel que j'utilise le plus avec la webcam.

Camorama est un autre logiciel pour webcam... Chez moi la définition est plus petite qu'avec Gqcam mais Camorama permet d'appliquer différents effets à l'image tel que le mode noir et blanc, le mode négatif, un flou ou encore les algorithmes de Laplace, Sobel, Wacky... On peut assez facilement se faire une image plus ou moins dans un style matrix ou terminator p:
Mais la petite taille des images générées gache un peu :frown:

Corkscrew est un logiciel de tunneling HTTP. Il utilise la méthode CONNECT du protocole. Pour ceux qui n'y connaissent rien le tunneling est une encapsulation d'un flux de données dans un protocole... à ne pas confondre avec les canaux cachés où on injecte les données dans le protocole lui-même.
Corkscrew prend quatre arguments : ip du proxy, port du proxy, ip de la machine destination et port de la machine destination. Le logiciel marche sous la forme d'un netcat, c'est à dire que ce que l'on tappe dans la console est envoyé sur le réseau... Ca limite donc l'utilisation du logiciel... on aurait préféré une redirection des communications de façon transparente et surtout permettant d'utiliser Corkscrew avec les logiciels standards (clients FTP, IRC etc)
D'ailleurs je vais peut-être coder une petite tool de tunneling HTTP en Python un de ces jours :wink:

Pour terminer j'ai testé deux programmes : Code2HTML et Source-highlight. Ils permettent, à partir d'un fichier source, de générer une belle page HTML avec le code en couleur (coloration syntaxique). Bref deux programmes qui se rendent indispendables si on souhaite publier une étude de code etc. Les deux outils supportent un nombre de langages impréssionnant (allez voir sur leurs sites respectifs) ainsi qu'une plétore d'options pour personnaliser la page HTML générée.

Fin de la transmission :cool: