====== Wget ======
Wget est un outil de téléchargement très commun sous les systèmes type Linux.
Il s'utilise en ligne de commande. L'outil a des paramètres d'utilisation qui le rendent assez puissant, mais dans les cas où il ne se suffit pas à lui-même, on peut écrire des mini scripts en shell ou python si l'on a la chance de connaître un peu ces langages.
Wget dispose aussi d'interfaces graphiques (front-end) comme gwget, qui peuvent simplifier l'ajustement de ses options si la ligne de commande vous rebute.
Un peu de documentation:
* La page man de wget
* [[http://doc.ubuntu-fr.org/wget|celle d'Ubuntu-fr]], où des exemples d'usages sont donnés
* D'[[http://rationallyparanoid.com/articles/wget.html|autres exemples d'usage]] (en anglais)
===== Cas d'utilisation =====
==== Télécharger les fichiers d'un index HTTP ====
Par exemple, avec les sites mentionnés dans l'article [[:documentation:audio:streaming-musique-depuis-ftp-et-depots-http]].
Tout télécharger sans se prendre la tête:
wget -mc "http://rob1.j92.free.fr/Musique"
==== Télécharger les fichiers de type .mp3 d'une page web ====
wget 'http://foetusparty.free.fr/demo%20k7.htm' -A '*.mp3' -r -l 1
Le -A signifie Accept, c'est la liste des extensions de fichiers que l'on conserve.
Le -r signifie récursif, et le -l limite le niveau de récursivité de façon à ce qu'il ne fouine pas tous les autres liens html de la page.
==== Télécharger les mp3 d'un site web avec wget + script ====
Admettons qu'on tombe sur un site avec des mp3 dont on peut retrouver les liens mais dont le téléchargement n'est pas évident. On peut utiliser un gestionnaire de téléchargements, un aspirateur de sites web, ou bien wget avec un script.
[[http://www.le-terrier.net/jukebox/index.html|Le Terrier]] est un site un peu rigolo avec plein de trucs dedans qu'on prend pas forcément le temps de mater mais où on voit que ça a l'air intéressant, direction sa page «[[http://www.le-terrier.net/jukebox/index.html|musique]]».
Matons les sources HTML (CTRL+U), car pour tout site web qui joue de la musique, il y a forcément référence aux fichiers sons quelque part. Ici on a de la chance, le code est plutôt clair à lire. Il n'y a pas les liens mp3 directement dedans, mais ils sont dans un fichier .js à part, on click sur ''tracks.js''.
var tracks = [
{"url": "http://www.le-terrier.net/albums/arbag/soir1/sons/mp3/donner-le-ton.mp3",
"title": "Donner le ton",
"artists": ["L.L. de Mars", "François Coquet"],
"sections": ["composition", "concert", "poésie"]},
{"url": "http://www.le-terrier.net/musique/lldm/sonnets/01.mp3",
"title": "Sonnet étriqué I",
"artists": ["L.L. de Mars"],
"sections": ["lectures", "poésie", "solo", "expérimentation"]},
{"url": "http://www.le-terrier.net/musique/lldm/sonnets/02.mp3",
"title": "Sonnet étriqué II",
"artists": ["L.L. de Mars"],
"sections": ["lectures", "poésie", "solo", "expérimentation"]},
La liste des fichiers est bien là, mais il faut épurer cette liste pour qu'elle soit exploitable par wget, on va donc écrire un petit script en shell. En fait, ça tiendra en une ligne.
On enregistre la liste complète dans un fichier que l'on a qu'a nommer listejs.txt.
=== Écriture du script shell ===
Ça, ça balance dans le terminal le contenu du fichier.
cat listejs.txt
Le caractère '|' indique qu'on passe le flux vers la commande qu'on indique après, plutôt que vers le terminal.
Ici, la commande qui suit le '|' est ''grep'', qui permet de filtrer selon le motif que l'on a indiqué.
cat listejs.txt | grep mp3
Résultat:
{"url": "http://www.le-terrier.net/albums/arbag/soir1/sons/mp3/donner-le-ton.mp3",
{"url": "http://www.le-terrier.net/musique/lldm/sonnets/01.mp3",
{"url": "http://www.le-terrier.net/musique/lldm/sonnets/02.mp3",
A partir de là, on a une ligne par mp3, mais toujours du code javascript qu'on doit nettoyer. Le nettoyage va se faire avec ''cut'', qui permet de tailler une chaîne de caractères en plusieurs champs selon un critère de séparation.
Les 2 options de ''cut'' que l'on utilise ici sont: ''-d'', pour préciser quel caractère délimiteur, et ''-f'', pour indiquer le numéro de la section que l'on va conserver.
cat listejs.txt| grep mp3 | cut -d '"' -f 4
Résultat:
http://www.le-terrier.net/albums/arbag/soir1/sons/mp3/donner-le-ton.mp3
http://www.le-terrier.net/musique/lldm/sonnets/01.mp3
http://www.le-terrier.net/musique/lldm/sonnets/02.mp3
Et là, on a fini. Pour chaque ligne, on a le lien http:// du mp3. On va donc enregistrer le résultat dans un fichier. On peut faire cela en redirigeant le résultat avec '>'.
cat listejs.txt| grep mp3 | cut -d '"' -f 4 > mp3terrier.txt
On peut ensuite donner à wget le résultat contenu dans le fichier ''mp3terrier.txt''.
On invoque wget avec ''-c'' pour dire "continue", c'est à dire reprise si l'on a interrompu le téléchargement ; ''-x'' demande à wget de recréer l'arborescence de répertoires tels qu'il les trouve dans les liens ; et ''-i'' comme "input" sert à indiquer le nom du fichier dont on lira les URLs.
wget -c -x -i mp3terrier.txt
Bon le hic apparemment c'est que sur le terrier ça télécharge à 2 à l'heure... mais c'est pas grave, on aura nos mp3s !
=== Addendum 1 - sed appliqué à Le Terrier ===
edmc73 nous fait part d'une commande qui remplace l'usage des ''cut'' et ''grep'' du script ci-dessus.
sed -e '/url/!d' -e 's/^\s*{"url": "\(.*\)",/\1/' tracks.js
=== Addendum 2 - sed dans un cas plus général ===
edmc73 [[http://forum.p2pfr.com/sutra145459.html|a encore frappé]], ce motif devrait convenir à bon nombre de cas d'extration d'URLs de MP3, éventuellement avec des adaptations mineures:
Pour traiter une donnée ayant chaque ligne du type:
dublablacodecodeOnSenFoutDuNomdublablacode
... et en extraire la partie **fichier.xyz**, on pourra utiliser:
sed -r 's/.*href=".*[$/](.*)".*/\1/' tonFichier.html
Des explications simples sur sed sur [[http://wiki.edmc73.com/linux/sed|son wiki]].
===== Liens =====
* Site officiel: https://www.gnu.org/software/wget
* Wikipédia: [[wp>Wget]] (en), [[wpfr>GNU_Wget]] (fr)
* Exemple d'utilisation avec le site archive.org (paramètre ''-e robots=off'' nécessaire): http://blog.archive.org/2012/04/26/downloading-in-bulk-using-wget/ ; idem ici: http://codenimbus.com/2010/08/02/override-robots-txt-with-wget/