Article publié dans Linux Magazine 106, juin 2008.
La perle de ce mois-ci a été rédigée par Philippe "BooK" Bruhat
(book@mongueurs.net
), de Lyon.pm et Paris.pm.
Vous surfez sur un site de vidéos en ligne, et voilà que vous en voyez une tellement bien que vous voulez absolument la conserver. Il existe de nombreux sites qui vous proposent de sauvegarder les vidéos au format FLV, à partir de l'URL originale sur YouTube.
Mais je suis paresseux, et je n'ai pas envie de me fatiguer à copier/coller des URL juste pour garder une vidéo. Je préfère que ça soit automatique, quitte à faire le tri par la suite.
La meilleur manière de capturer un flux qu'on reçoit par le web, c'est
tout simplement de demander au proxy de le faire. Il se trouve que j'ai
justement écrit un proxy web en Perl. :-)
La technique est simple :
Pour tout fichier dont le type MIME correspond au format à sauvegarder,
trouver l'identifiant du fichier (souvent stocké sous la forme
id=
id dans l'URL de la requête)
construire un nom de fichier (en incluant le nom du site et la date, pour que tout soit un peu plus simple à retrouver)
Le résultat est assez court :
#!/usr/bin/env perl use strict; use warnings; use HTTP::Proxy; use HTTP::Proxy::BodyFilter::save; use Digest::MD5 qw( md5_hex ); use POSIX qw( strftime ); my $proxy = HTTP::Proxy->new(@ARGV); # un filtre pour sauver les fichiers FLV my $flv_filter = HTTP::Proxy::BodyFilter::save->new( filename => sub { my ($message) = @_; my $uri = $message->request->uri; # trouve l'id dans l'URL ou sinon calcule un hash MD5 my ($id) = $uri->query =~ /id=([^&;]+)/i; $id = md5_hex($uri) unless $id; # construit le nom de fichier en ajoutant le nom du site my ($host) = $uri->host =~ /([^.]+\.[^.]+)$/; my $file = strftime "flv/%Y-%m-%d/${host}_$id.flv", localtime; # ignore le fichier si on l'a déjà return if -e $file && -s $file == $message->content_length; # renvoie le nom du fichier à sauver return $file; } ); # ajoute le filtre sur tous les types MIME qu'on veut sauver for my $mime (qw( video/flv video/x-flv )) { $proxy->push_filter( mime => $mime, response => $flv_filter, ); } # démarre le proxy $proxy->start;
Attention, lors du développement de ce script, j'ai découvert un certain
nombre de bugs dans HTTP::Proxy::BodyFilter::save
. Il vous faudra donc
au moins la version 0.21, qui devrait être sur CPAN quand vous lirez ces
lignes.
HTTP::Proxy
, un module pour prendre le contrôle du web.
Flash Video, quelques explications sur le format.
WWW::YouTube::VideoURI
, de Gavin Brown.
Un module pour trouver l'URI d'une vidéo Flash sur http://www.youtube.com/, et par exemple la télécharger directement.
Envoyez vos perles à perles@mongueurs.net
, elles seront peut-être
publiées dans un prochain numéro de Linux Magazine.
Copyright © Les Mongueurs de Perl, 2001-2011
pour le site.
Les auteurs conservent le copyright de leurs articles.