photo of devloop

devloop :: blog

sécurité informatique, programmation, Linux et plus encore

Subscribe to RSS feed

Posts tagged with "mp3"

Blind Test Fail

, , , ...

Actuellement sur le site de OÜI-FM, on peut trouver un blind-test en ligne pour gagner un smartphone Motorola Defy.

Le principe du blind-test est, comme nous le rappelle Wikipedia :

un jeu où vous devez deviner l'interprète, le titre ou l'année d'un morceau à partir d'un enregistrement musical


Seulement si on affiche la source de la page HTML du jeu, qu'on relève les urls des extraits musicaux (des fichiers mp3) pour les sauvegarder localement et qu'on les passe par exemple dans Audacious... le titre apparait !
Les organisateurs n'ont pas pensé à retirer les métadonnées (tags ID3) des fichiers.

Ou encore avec des commandes standards sous Linux :
$ strings extrait1.mp3 | head -3
CTT2
OH LA LA - Relax
engiTunPGA

Le titre du permier extrait est donc "Relax" de "Oh La La" p

Une librairie et un lecteur en Python pour MP3Tunes

, , , ...

Je bossais de temps en temps sur une implémentation de l'API MP3Tunes en Python et je viens tout juste de donner un coup de collier pour finir tout ça.
Le code peut être utilisé comme une librairie (avec import) ou appelé directement pour lancer un player minimaliste en mode console (CLI).

Les commandes du player permettent :
  • de passer à la chanson suivante (n)
  • de mettre en pause/reprendre (p)
  • de couper/remettre le son (m) (pour mute)
  • d'augmenter (+) ou de baisser (-) le son
  • d'afficher l'aide (h)
  • de quitter (q)

Le lecteur demande vos identifiants (il est possible de les garder en mémoire dans un fichier de conf) et récupère l'ensemble de vos titres pour les lire de manière aléatoire.

Ca tourne sous Linux car basé sur la GLib et GStreamer pour la lecture.

Code à télécharger ici : pytunes : python library and player for mp3tunes

Réorganiser l'ordre de lecture sur un baladeur mp3 MPMAN

, , , ...

Les MPman sont une gamme de baladeurs MP3 plutôt simple au look minimaliste mais efficace et pas très cher.
Je dispose d'un modèle MPF402 et j'ai toujours été contrarié par l'ordre de lecture des mp3 dans un dossier qui ne respecte ni les tags ID3 ni le classement alphabétique des fichiers.

Ma dernière supposition était que l'ordre utilisé par ces lecteurs se basait sur la date de dernière modification des fichiers. J'ai écrit un script Python qui remodifiait cette date en fonction du classement alphabétique mais après essai il s'est avéré que ces baladeurs se basent sur un autre paramêtre, à savoir la date de création du fichier (date à laquelle le fichier est rajouté dans le balladeur).

Et là ça se complique puisque l'on ne peut pas modifier cette date facilement. Il ne suffit pas par exemple de renommer un fichier pour le faire apparaître comme nouveau.
Une solution est de retirer les fichiers et de les remettre cette fois dans le bon ordre, les uns après les autres. Opération fastidieuse sad

Finalement après recherche j'ai trouvé cette page qui rescense quelques logiciels agissant directement sur le système de fichier FAT32 et capables de modifier la date de création des fichiers.

Comme j'étais sous Windows j'ai eu recours à FAT Sorter qui s'est montré efficace quoi qu'un peu lent. Il a aussi des difficultées pour les dossiers avec un nombre relativement important de fichiers (ex: 70) qui oblige à relancer le logiciel une seconde fois pour reclasser ce qu'il a laissé de côté.
Dans tous les cas j'ai maintenant des titres qui sont dans le bon ordre sur mon baladeur et je suis satisfait smile

Je pense que l'info pourra intéresser des personnes dans le même cas que moi surtout que beaucoup de baladeurs MP3 semblent manquer de fonctionnalité d'organisation.
La liste indique aussi un logiciel FAT Sort sous Linux que je n'ai pas encore eu l'occasion d'essayer.

Installer Pinky-Tagger sous openSUSE 11.3

, , , ...

Pinky-Tagger est un tagger mp3 (ID3) très puissant permettant d'effectuer des recherches sur les bases cddb ou MusicBrainz à partir d'empreintes des fichiers.
Son développement semble malheureusement être en pause depuis 2009 mais il reste fonctionnel et efficace smile

Le paquet d'étant pas disponible pour openSUSE 11.3, il est cependant assez simple de l'installer.
Il faut récupérer 3 librairies (toutes sont dans le dépôt standard), soit avec YaST soit avec zypper :
zypper install libopenssl0_9_8 libofa0 libmusicbrainz3-6


On récupère ensuite le rpm de la version 2.2.3 de Pinky-Tagger (i586, x86_64 ou ppc selon votre architecture) :
http://packman.links2linux.de/package/PinkyTagger2/114131

On l'installe finalement avec la commande suivante (à modifier selon le nom de fichier rpm récupéré) :
rpm -ivh kde4-pinkytagger-2.2.3-0.pm.2.1.x86_64.rpm

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 ? bigsmile )
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à bigeyes
"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 bigsmile . 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