Envoyer des images ou des sons générés par Processing sur un serveur FTP

Cet article est issu d'un fil de discussion sur le forum codelab.fr que j'ai initié il y a quelques jours. Voici un petit programme fait avec Processing.py. (j’ai choisi le mode python de Processing, pour utiliser la bibliothèque ftplib de python… peut-être y a t-il encore plus simple, m'enfin). Il permet d’envoyer des images générées par Processing dans un dossier « img » sur un serveur FTP. Également, avec un fichier php, nous pourrons afficher dynamiquement toutes les images contenues dans le dossier.
from ftplib import FTP

#INIT SKTECH
size(300, 300)
nom = str(day()) + str(month()) + str(hour()) + str(minute()) + ".png" # nom du fichier genere

#DESSIN
fill(random(255), random(255), random(255))
ellipse(random(width), random(height), 30, 30)
save(nom)

#CONNEXION changer variables
host = "ftp.******.fr"
user = "******"
password = "******"
connect = FTP(host, user, password)
#VERIF
etat = connect.getwelcome() # Envoi message de bienvenue si connection
print "etat connexion ftp ", etat
rep = connect.dir() # Affiche repertoires
print rep

#ENVOI
file = open(nom, 'rb')
connect.sendcmd('CWD www/exemple/img') # Commande FTP pour se placer dans un dossier precis. A modifier.
connect.storbinary('STOR ' + nom, file)
file.close()

#DECONNEXION et fermeture du programme.
connect.quit()
println("\nTermine !")
exit()
Voici un code .php très sommaire pour afficher toutes les images du dossier. Dans l’exemple, le fichier .php ainsi que le dossier contenant les images sont placé sur mon serveur dans « www/exemple ». À modifier selon vos besoins, évidemment ! :-)

<? php
$fichiers = glob('img/*');
foreach($fichiers as $i){
echo "<img class=\"img\" src=\"" . $i . "\">";
}
?>

Un autre exemple avec draw. C’est encore imparfait puisque l’animation se fige pendant l’envoi…
from ftplib import FTP

#envoie une image lorsqu'on appuie sur 'e'

def setup():
    size(300, 300)
    noStroke()

def draw():
    fill(random(255), random(255), random(255))
    ellipse(random(width), random(height), 30, 30)
    ellipse(mouseX, mouseY, 10, 10)

def keyReleased():
    if key == 'e':
        println("envoi")
        envoi()

def envoi():
    # On enregistre notre image.
    nom = str(day()) + str(month()) + str(hour()) + str(minute()) + str(second()) + ".jpg"
    save(nom)
    println(nom)
    #delay(1000) #un delay pour laisser le fichier s'ecrire tranquillement

    # On ouvre serveur, connexion, envoi.
    host = "******"
    user = "******"
    password = "******"
    connect = FTP(host, user, password)
    etat = connect.getwelcome()
    print "etat connexion ftp ", etat
    rep = connect.dir()
    print rep

    file = open(nom, 'rb')
    connect.sendcmd('CWD www/exemple/img')
    connect.storbinary('STOR ' + nom, file)

    file.close()
    println("debug file close")
    connect.quit()
    println("\nTermine !")
Avec ça, à titre d'exemple, j'ai générée et envoyé automatiquement sur l'internetosphère des déclinaisons d'un petit dessin simplet fait sous Processing. http://www.completement.pt/exemple/ …Et ça marche aussi avec du son! Toujours avec Processing.py, ci-dessous, un programme qui permet de lancer l'enregistrement d'un son avec un microphone (touche 'r'), de cesser l'enregistrement (on rappuie sur 'r') puis de sauvegarder le fichier et de l'envoyer sur notre serveur (touche 's'); j'ai juste repris en Processing.py les exemples de la bibliothèque Minim… C'est fait dans la perspective d'une installation interactive où les résultats générés par le dispositif serait archivés sur un site internet en quasi temps-réel, ou du moins automatiquement (bientôt j'espère des images du projet).
from ftplib import FTP
add_library('minim')

def setup():
    size(300, 300)
    global minim, input, recorder
    global nom

    minim = Minim(this)
    input = minim.getLineIn()
    nom = str(day()) + str(month()) + str(hour()) + str(minute()) + ".wav"
    recorder = minim.createRecorder(input, nom)

def draw():
    background(0)
    if recorder.isRecording():
        fill(0, 255, 0)
        println("enregistrement")
    else:
        fill(255)

    ellipse(width/2, height/2, 30, 30)
    envoi()
    delay(500)

def envoi():
    nom = str(day()) + str(month()) + str(hour()) + str(minute()) + str(second()) + ".png"

def keyReleased():
    if key == 'r':
        if recorder.isRecording():
            recorder.endRecord()
        else:
            recorder.beginRecord()
    if key == 's':
        recorder.save()
        println("sauve")
        execfile('envoi.py')
        println("envoyeee")
N'oublions pas envoi.py pour la connexion et l'envoi de fichier sur le serveur :
# coding: utf8

host = "***"
user = "***"
password = "***"
connect = FTP(host, user, password)
etat = connect.getwelcome()
print "etat connexion ftp ", etat
rep = connect.dir()
print rep

file = open(nom, 'rb')
connect.sendcmd('CWD www/exemple/son')
connect.storbinary('STOR ' + nom, file)

file.close()
println("debug file close")
connect.quit()
println("\nTermine !")
On reprend un peu notre fichier .php pour afficher nos fichiers sonores fraichement enregistrés…

Sons

<? php
$fichiers = glob('img/*');
foreach($fichiers as $i){
echo "<img class=\"img\" src=\"" . $i . "\">";
}
? >

      

C'est perfectible: le format .wav n'est sans doute pas le plus approprié pour le web. On pourrait bidouiller un petit quelque chose pour convertir le fichier en .mp3/.oggavant de l'envoyer sur le web.

retour