Ma radio ouverte

Linux Gazette n°92 - Juillet 2003

Mark Nielsen


Table des matières
1. Introduction
2. Configurer Apache
3. Utiliser Grip pour la récupération
4. Le script Python
5. Lire la liste
6. Conclusion
7. Références

1. Introduction

Écouter des CDs me rend malade. La moitié des morceaux d'un CD sont sans intérêt. Je n'aime pas changer de CD. Les radios commerciales me donnent la nausée avec leur stupide crise de maturité, qui essaient d'attirer les adolescents en s'efforçant d'agir comme eux (grandissez). J'aime écouter de la musique (sur des CDs) ou des concerts sur NPR en bruit de fond tout en programmant. J'ai décidé de développer une méthode pour faire lire des morceaux à mon ordinateur et des concerts de NPR comme s'il s'agissait d'une radio. Celle-ci éliminera les CDs et les concerts des radios commerciales. Je souhaite que mon ordinateur joue tout cela dans un ordre aléatoire. La première chose a été de récupérer des morceaux sur mes CDs et de les lire dans un ordre aléatoire. La seconde (qui n'est pas dans cet article) a consisté à télécharger une liste d'écoute de tous les concerts que j'apprécie sur NPR (j'espère qu'un jour NPR acceptera mon offre de développer des listes d'écoute (à titre de donation) pour leurs auditeurs).

Pour l'instant, j'essaie de faire réellement simple. À l'avenir, j'envisage d'ajouter des listes d'écoute, d'attribuer un score aux morceaux, de placer l'ensemble dans une base de données PostgreSQL, d'ajouter des comptes, etc.

Je suis très fainénant. Tellement fainéant que je n'ai pas pris la peine de d'examiner les divers gestionnaires mpeg web de vos morceaux favoris. Je voulais juste quelque chose capable de passer 200 morceaux dans un ordre aléatoire de façon à simuler une station de radio. J'ai dû d'abord commencer par récupérer les morceauw puis écrire un script Python simple pour en sortir une liste d'écoute.


2. Configurer Apache

Sur votre serveur Linux, trouvez le répertoire racine html de votre serveur httpd. Sur certains systèmes, il est situé dans /var/www/html. En supposant qu'il en est ainsi, saisissez :

cd /var/www/html
mkdir audio

Copiez maintenant tous vos fichiers mp3, rm, wav ou autres fichiers audio dans le répertoire /var/www/html/audio. Remarque : n'utilisez pas votre serveur web pour quiconque en dehors de vous-même. Vous seul pouvez écouter ces morceaux, sinon vous risquez d'avoir des problèmes de détournement de copyright. Contactez un juriste pour plus d'informations sur les aspects légaux.

Pour démarrer votre serveur web, d'ordinaire, vous pouvez saisir : service httpd start. Si cela ne fonctionne pas, examinez la documentation accompagnant votre distribution Linux découvrir comment démarrer et arrêter le service web. Habituellement, le serveur web par défaut sur la plupart des systèmes Linux est Apache.


3. Utiliser Grip pour la récupération

Après avoir testé de nombreux programmes, Grip m'a semblé être le plus simple à utiliser pour récupérer des morceaux sur un CD. Il les organise par auteur et par album. Agréable. Voici les étapes qui m'ont permis de configurer Grip.

  1. Téléchargez et installez LAME. Prenez conscience des problèmes de brevets logiciels.
    cd /usr/local/src
    lynx --source http://twtelecom.dl.sourceforge.net/sourceforge/lame/lame-3.93.1.tar.gz > lame-3.93.1.tar.gz
    tar -zxvf lame-3.93.1.tar.gz
    cd lame-3.93.1
    ./configure --prefix=/usr/local/lame
    make install
    ln -s /usr/local/lame/bin/lame /usr/bin/lame

  2. Démarrez Grip.

  3. Configurez Grip. Sous le menu Config, procédez comme suit. Cliquez sur Encode, choisissez lame comme encodeur. Là où se trouve la mention Encode File Format, veillez à spécifier le répertoire /var/www/html/audio comme répertoire de base. Le mien ressemble à : /var/www/html/audio/%A/%d/%t_%n.mp3.

  4. Cliquez sur Tracks dans le menu principal et sélectionnez les pistes à récupérer.

  5. Cliquez sur Rip dans le menu principal, puis cliquez sur Rip + Encode.


4. Le script Python

Placez ce script python dans /var/www/cgi-bin/playlist.py. Exécutez ensuite la commande chmod 755 /var/www/cgi-bin/playlist.py. Après avoir correctement installé ce script python (veuillez utiliser Python 2.2) et être sûr qu'il fonctionne correctement, vous pouvez être amené à changer l'url 127.0.0.1 en l'adresse IP de votre ordinateur sur le réseau, de sorte que d'autres ordinateurs présents à votre domicile peuvent lire les morceaux également.

#!/usr/bin/python
# Assurez-vous que cette ligne soit la première de ce fichier.

### Copyright sous GPL

  ## importez les modules python dont nous avons besoin.
import os, re, time, random

  ## Initialisez quelques variables. Vous pourrez les changer selon vos besoins.
Home = "/var/www/html/audio"
Url_Base = "http://127.0.0.1/audio"
Song_Max = 200
List_Type = "mpegurl"

## NE CHANGEZ RIEN SOUS CETTE LIGNE, À MOINS QUE VOUS NE SOYEZ UN EXPERT DE PYTHON.
File_Match = re.compile('[{mp3}{rm}{wav}{ogg}{mpeg}]$')
Home_Re = re.compile('^' + Home)
List_Types = {'smil':'application/smil', 'mpegurl':'audio/x-mpegurl'}

#---------------------------------------
  ## Cette fonction explorera tout et obtiendra le chemin absolu de tous les
  ## fichiers qui correspondent. C'est une méthode récursive.
def Dir_Contents(Item=""):
  Final_List = []
  if Item == '': return ('')
  elif os.path.isdir(Item):
    List = os.listdir(Item)
    for Item2 in List:
      Item3 = Item + "/" + Item2
      Temp_List = Dir_Contents(Item=Item3)
      for Item4 in Temp_List: Final_List.append(Item4)
  elif os.path.isfile(Item):
    if File_Match.search(Item):   return([Item])
    else:   return([])
  return (Final_List)

#--------------------------

List =  Dir_Contents(Home)
List_Copy = List
  ## Randomisez le nombre de fois où nous appelons «random».
Secs = int(time.strftime('%S')) * int(time.strftime('%H')) * int(time.strftime('%M'))
for i in range(0,Secs): random.random()

  ## Obtenez aléatoirement un fichier à la fois jusqu'à ce qu'il n'en reste
  ## plus aucun.
New_List = []
while (len(List_Copy) > 0):
  Position = random.randint(0,len(List_Copy) - 1)
  New_List.append(List_Copy[Position])
  del List_Copy[Position]

  ## Refaites les URLs dans la liste.
Urls = []
for Item in New_List:
    ## Pour chaque élément, supprimez le préfixe du répertoire personnel ('Home') et ajoutez
    ## l'URL au début de cette dernière.
  Url = Url_Base + Home_Re.sub('', Item)
  Urls.append(Url)

  ## Si nous sommes au délà du nombre de morceaux que nous souhaitons écouter, arrêter.
  ## Des points de bonus si vous pouvez découvrir combien de morceaux se trouvent
  ## dans le tableau lorsque Song_Max = 200.
if len(New_List) > Song_Max:  New_List = New_List[0:Song_Max]

  ## Si la personne qui a édité ce fichier a un type de liste invalide...
if not List_Types.has_key(List_Type): List_Type = 'mpegurl'
Content_Type = List_Types[List_Type]

  ### Maintenant, affichez le contenu.
print "Content-Type: " + Content_Type + "\n\n"

if List_Type == 'mpegurl':
  for Url in Urls: print Url
elif List_Type == 'smil':
  print "\n<smil>\n   <body>\n"
  for Item in Urls:  print "      >audio src='" + Url+ "'/<"
  print "   </body>\n>/smil<\n"
else:
  for Url in Urls: print Url


#------------------------------------------------------------------------
#                          Open Radio version 1.0

#                       Copyright 2003, Mark Nielsen
#                            All rights reserved.
#    This Copyright notice was copied and modified from the Perl
#    Copyright notice.
#    This program is free software; you can redistribute it and/or modify
#    it under the terms of either:

#        a) the GNU General Public License as published by the Free
#        Software Foundation; either version 1, or (at your option) any
#        later version, or

#        b) the "Artistic License" which comes with this Kit.

#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See either
#    the GNU General Public License or the Artistic License for more details.

#    You should have received a copy of the Artistic License with this
#    Kit, in the file named "Artistic".  If not, I'll be glad to provide one.
#    You can look at http://www.perl.com for the Artistic License.

#    You should also have received a copy of the GNU General Public License
#   along with this program in the file named "Copying". If not, write to the
#   Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
#    02111-1307, USA or visit their web page on the internet at
#    http://www.gnu.org/copyleft/gpl.html.

5. Lire la liste

Personnellement, je me sers de Real Player. J'ai essayé xmms mais cela n'a pas fonctionné pour une raison quelconque (avec la liste mpegurl). Comme Real Player accepte à la fois smil et mpegurl, je l'utilise. J'aimerais un jour passer à un lecteur libre sous GPL.

Contentez-vous de saisir dans votre navigateur, RealPlayer ou votre lecteur habituel : http://127.0.0.1/cgi-bin/playlist.py.


6. Conclusion

Cette petite configuration me convient parfaitement. Dans le futur, je souhaite créer des comptes, des listes d'écoute, un suivi des morceaux non encore lus, attribuer un score à un morceau, et diverses autres choses. Pour l'instant, j'en ai terminé avec celle-ci et suis sur le point de créer une liste d'écoute de mes concerts favoris sur NPR.

J'ai une foule d'idées de l'endroit où cela pourrait me conduire. Du fait de mes nombreuses mauvaises expériences avec Flash, Real Player, Windows Media Player et Javascript, il se pourrait que quelque chose puisse se développer ici. J'ai entendu parler d'une pléthore de projets sur les stations radio internet, mais on dirait qu'aucun d'entre eux ne semble réllement s'attaquer au marché. Elles semblent reléguées aux vieux jours de la radio. Elles doivent aller de l'avant et ne pas être freinées par les géants des médias (légalement). Il semble que les stations de radio internet ne voient pas les éléments essentiels de la situation. Pour l'instant, je vais continuer à développer ma propre petite radio pour moi-même et peut-être en faire quelque chose ultérieurement.


7. Références

  1. http://www.nostatic.org/grip/

  2. http://www.apache.org

  3. http://www.python.org

  4. http://service.real.com/help/library/earlier.html

  5. Si cet article change, il sera disponible ici : http://www.tcu-inc.com/Articles/34/open_radio.html

Mark Nielsen travaille chez Crisp Hughes Evans. Pendant ses loisirs, il écrit des articles sur le Logiciel Libre (GPL) ou la documentation du libre (FDL). Merci de le contacter par courrier électronique à et de mettre « ARTICLE » dans le sujet, sinon le message sera supprimé sans avoir été lu -- pour arrêter les spammeurs.

Copyright © 2003, Mark Nielsen.

Copying license http://www.linuxgazette.com/copying.html

Paru dans le n°92 de la Linux Gazette de juillet 2003.

Traduction française par Guillaume Lelarge .

Relecture de la traduction française par Joëlle Cornavin .