tuto Perl : Créer sa base de données mp3 sur sa machine en 15 minutes ! - les scripts perl

home
retour

<< retour aux chapitres du tuto

qu'est-ce qu'on va voir sur cette page ?

infos (ou rappels)

résumé de la manip

1- scanner les mp3 du disque dur

2- scanner les mp3 des CD-Rom

3- traitement des fichiers scan et insertion dans la bdd

et voilà le resultat

si ça marche pas

Pour les bidouilleurs fous

Pour aller plus loin

infos (ou rappels)

les phases préalables

il faut avoir préalablement installé les serveur web-php-mysql et ajouté l'interface de recherche (script php)

<< la préparation

la commande dir

vous connaissez la commande 'dir' ?

si vous saisissez cette commande en mode console, elle affiche le contenu du répertoire (directory) courant

essayez
C:\>dir

comme toute commande, on peut lui donner des paramètres

essayez
C:\>dir /s
le paramètre /s permet l'affichage du contenu du répertoire courant et de tous les sous-répertoires

puis
C:\>dir /b
le paramètre /b modifie l'affichage du résultat

puis
C:\>dir /s /b D:\musique\*.mp3 > toto.txt
on recherche tous les fichiers finissant par .mp3 dans le répertoire D:\musique et ses sous répertoires, on redirige le résultat dans le fichier toto.txt

résumé de la manip

on va devoir scanner les mp3 du disque dur
on va devoir scanner les mp3 sur les CD-Rom

on va devoir récuperer les données pour les inserer dans notre base de données

organisation des répertoires

les scripts se trouveront dans le répertoire 'C:\mp3_BDD'

les fichiers résultat de scan seront placés dans le répertoire ' C:\ mp3_BDD\data\'

1- scanner les mp3 du disque dur

Là pas de problème, on utilise la commande 'dir'

le nom du fichier scan choisi pour le disque dur est HD.txt

A FAIRE :

fichier C:\mp3_BDD\rech_mp3_HD.bat
@echo off
dir /s /b D:\musique\*.mp3 > .\data\HD.txt
dir /s /b D:\musique\*.wma >> .\data\HD.txt

EFFET : le fichier HD.txt est créé

2- scanner les mp3 des CD-Rom

on va utiliser un script perl pour gérer les n° de CD

le nom du fichier scan choisi pour chaque CD-Rom est CD<numero> .txt
exemple CD10.txt

fichier C:\mp3_BDD\rech_mp3_CD.bat
@echo off
perl -w rech_mp3_CD.pl

A FAIRE :

fichier C:\mp3_BDD\rech_mp3_CD.pl
$DRIVE_CD = "F:";  # lettre de lecteur CD

print "\n\n VEUILLEZ SAISIR LE NO DE CD PRESENT DANS LE LECTEUR $DRIVE_CD (tapez q pour quitter)\n > ";
while(<>)
{
  exit if(/q/i);

  chomp;
  if(/^[0-9]{2}$/)
  {
    system('dir /s /b '.$DRIVE_CD.'\\*.mp3 > .\\data\\CD'.$_.'.txt');
    print "\n  le fichier .\\data\\CD".$_.".txt a ete cree\n";
  }
  else
  {
    print "!!! erreur de saisie : taper 2 chiffres !!! \n";
  }
  print "

VEUILLEZ INSERER LE CD SUIVANT DANS LE LECTEUR $DRIVE_CD ET SAISIR SON NO DE CD(tapez q pour quitter)\n > ";
}

EFFET : les fichiers CD01.txt, CD02.txt etc... sont créés

3- traitement des fichiers scan et insertion dans la bdd

A FAIRE :

fichier C:\mp3_BDD\data_bdd.bat
@echo off
echo ne pas oublier de lancer mysql
echo.
perl -w data_bdd.pl >insert.txt
pause
echo pret pour le remplissage de la bdd
c:\Program Files\easyPHP1-8\mysql\bin\mysql -u root < insert.txt
fichier C:\mp3_BDD\data_bdd.pl
$ROOT_ZIC_DIR = '^D:\\\\musique\\\\';  # repertoire racine des musiques sur le disque dur
$repSrc = "./data/";                   # repertoire ou se trouvent les fichiers texte source

#------------------------------------- fonction creation ligne INSERT
sub creat_insert_sql
{
  my ($in, $ficTxt) = @_;
  @reps = split(/\\/, $in);  # chaque repertoire dans une liste
  $a = pop(@reps);           # on retire le dernier element de la liste
  $a =~ s/'/\\'/g;           # trt caracteres sql
  $in =~ s/\\/\\\\/g;
  $in =~ s/'/\\'/g;

  # generation de la chaine
  return "INSERT INTO t_mp3 (fic,lien) VALUES('$a','$ficTxt :: $in');\n";
}

#------------------------------------- fonction traitement debut de ligne CD ou HD
sub trt_CD_ou_HD
{
  ($ficTxt,$in,$r) = @_;
  return '' if($r eq '');
  my $out = '';
  foreach (@$in)
  {
    chomp;
    s/$r//i;
    $out .= creat_insert_sql($_, $ficTxt);
  }
  return $out;
}

#------------------------------------- fonction traitement de chaque fichier texte source
sub trt_fic_txt
{
  my @ficsTxt = @_;
  $out = '';

  foreach (@ficsTxt)
  # POUR CHQ FICHIER
  {
    open(IN,$repSrc.$_);
    @in = grep(/(\.wma$)|(\.mp3$)/i,<IN>);
    close IN;

    chomp;
    s/\.txt$//i;
    if(/^CD[0-9]{2}/i){ $regexpr = '^.*:\\\\';    }  # CAS CD
    elsif(/^HD/i)     { $regexpr = $ROOT_ZIC_DIR; }  # CAS DISQUE DUR
    else  { $regexpr = ''; }
    $out .= trt_CD_ou_HD($_, \@in, $regexpr);
  }
  return $out;
}

#------------------------------------- main
sub main()
{
  print '
DROP DATABASE db_mp3
CREATE DATABASE db_mp3;

USE db_mp3;
CREATE TABLE t_mp3(
id integer unsigned not null auto_increment,
fic varchar(250),
lien varchar(250),
primary key(id));

USE db_mp3;
';

  opendir(DIR,$repSrc);
  @fics = readdir(DIR);
  closedir DIR;
  @ficsTxt = grep(!/^\.\.?$/,@fics);
  print trt_fic_txt(@ficsTxt);
}

main();



EFFETS : le fichier insert.txt est crée et sert à créer notre bdd de mp3

et voilà le resultat

saisir dans son navigateur web préféré l'adresse suivante :
http://127.0.0.1/recherche_mp3.php

Ca devrait marcher...

si ça marche pas

Ca ne m'étonne pas, l'informatique, ça marche jamais !
Pour ne pas sortir du tuto, je vais seulement fournir quelques pistes de recherche et énumérer les raisons possibles

problème d'affichage de la page 'web local' (http://127.0.0.1/)

easyphp doit être démarré, (serveur apache + mysql) :
a-t-on l'icone en bas à droite à coté de l'heure
le point rouge clignote-t-il ?
que disent les fichiers log

problème d'affichage de la page de recherche mp3 (http://127.0.0.1/recherche_mp3.php)

la page recherche_mp3.php se trouve-t-elle dans le bon répertoire (C:\Program Files\easyPHP1-8\www\)
vérifier l'extension de la page php (recherche_mp3.php et non pas recherche_mp3.php.txt)

problème quand on clic sur le lien 'chercher' de la page

Il y a peut-être un message d'erreur sur la page
laisser tout par défaut dans l'installation d'easyphp
ne pas modifier les scripts du tuto (sauf ce qui est en rouge)

dans le code php on retouve des valeurs pour interagir avec mysql

tout s'affiche bien mais il n'y a pas d'enregistrements correspondants à ma recherche

essayer par saisir une chaine plus simple (une ou deux lettres)
verifier dans mysql que la table contient bien des enregistrements (relire la partie sur les requètes mysql ici)

Pour les bidouilleurs fous

ya plus qu'à :

Pour aller plus loin

Nous avons vu comment utiliser perl pour générer du code sql à partir d'un fichier texte
maintenant utilisons un script pour faire directement la recherche

ATTENTION : ce script ne sert que d'exemple, il n'est pas nécessaire de l'utiliser pour notre petite application

Voici le fichier recherche_mp3.pl ce script vous montre la recherche récursive dans un répertoire de départ
pourquoi récursive ?
la fonction RECH() s'appelle elle même

testons

Dans la partie 'CONSTANTES', saisir le répertoire de départ de recherche ATTENTION, ne pas le terminer par un slash (/)

Executer le script (C:\perl\perl -w recherche_mp3.pl)

fichier recherche_mp3.pl
#==============================================================================================
#                  SCRIPT DE RECUPERATION DES CHEMIN DES FICHIERS MP3
#==============================================================================================

# =================================================================================== VARIABLES
#     @TAB_RES : table resultat
#        $ROOT : chemin de depart de recherche des rep user
#         $OUT : nom du fichier resultat

# ================================================================================== CONSTANTES
 # repertoire de depart de recherche (on peut utiliser des /)
 $ROOT = "D:/ma_musique"; # <--- A MODIFIER

         $OUT = "insert_dbmp3.txt";
   $nom_table = "t_mp3";
       $chmp1 = "fic";
       $chmp2 = "lien";

# =================================================================================== FONCTIONS

# --------------------------------------------------------------------------
#                                                              FONCTION RECH
# fonction recursive de recherche de fichiers dans une arborescence
sub RECH
{
  my ($path_p) = @_;        # : chemin du repertoire pere
  my @list_rep = ();        # : tableau contenant le listing
  my $path_f = "";          # : chemin du repertoire fils
  my $rep_f = "";           # : nom du repertoire fils

  opendir (ATT, "$path_p"); @list_rep = readdir (ATT);
  foreach $rep_f(@list_rep)
  {
    $path_f = "$path_p/$rep_f";
    $_ = $rep_f;

    if ((/.*\.mp3/i) || (/.*\.wma/i))
    {
      # cas fichier trouve : ajout a la liste
      @TAB_RES = (@TAB_RES,CREAT_SQL($path_f,$rep_f));
    }
    elsif (!/^\.\.?$/)
    {
      # on continue la recherche
      RECH ($path_f);
    }
  }
  closedir (ATT);
}

# --------------------------------------------------------------------------
#                                                      FONCTION TRT_SPEC_SQL
# trt des caracteres speciaux en SQL (' et /)
sub TRT_SPEC_SQL
{
  my ($in) = @_;
  $_ = $in;
  s/\'/\\\'/g;
  s/\//\\\\/g;
  return $_;
}

# --------------------------------------------------------------------------
#                                                         FONCTION CREAT_SQL
# creation de la chaine sql d'insertion ds la table
sub CREAT_SQL
{
  my ($path,$fic) = @_;

  $out = "INSERT INTO $nom_table($chmp1,$chmp2)";
  $out .= " VALUES('". TRT_SPEC_SQL($fic) ."','". TRT_SPEC_SQL($path) ."');\n";
  return $out;
}

# ======================================================================================== MAIN

@TAB_RES = ();
RECH ($ROOT);

open(OUT,">$OUT");
print OUT @TAB_RES;
close OUT;

Ce script produit en sortie un fichier d'insertion sql


<< retour aux chapitres du tuto


Document made with Nvu

Valid HTML 4.01 Transitional