Les sites de streaming ça peut être chiant pour récupérer une info, un fichier. Je pense que cette astuce fonctionne pour différents sites (du style Grooveshark)
about:cache?device=memory pour chercher dans le cache de Firefox
clic droit enregistrer sous et vous avez un fichier temporaire html (file.part) qui contient le code hexa de ce qui a été mis en cache entre des balises pre. Une petite ligne de commande et vous obtenez le fichier binaire (file.bin) correspondant. Quelle ligne ?
Celle là (edit : attention ne fonctionne pas correctement car garde </pre> à la fin, voir l'edit d'après pour avoir un code qui fonctionne correctement) :
echo -e -n $(sed -n "/<pre>/,/<\/pre>/ p" file.part | sed -e "s:\ \ : :g" | cut -d " " -f 2-17 | tr -d "[:space:]\n" | sed 's/../\\x&/g') > file.bin
vlc file.bin et c'est la fête :-)
Edit : grâce aux commentaires, une version beaucoup plus rapide (80%) avec awk et xxd :
awk '/<pre>/ { printing=1 }
( printing == 1) {
max = 18; if (NF < 18) { max = NF }
for (i=2; i < max; i++)
printf $(i)
}
/<\/pre>/ { exit }' file.part | xxd -r -p > file.bin
Par contre, je ne suis pas sûr que max = NF si NF < 18 soit suffisant car si un espace est présent dans la représentation ASCII de la dernière ligne, ça risque de bugguer ? Bon dans 99% des cas ce sera bon.
Du coup, je propose cette solution qui semble encore plus rapide et qui devrait marcher tout le temps :
awk '/<pre>/ { p = 1 } /<\/pre>/ { exit } (p == 1) { print }' file.part | cut -d' ' -f 3-33 | xxd -r -p > file.bin
Un mixte entre les commentaires de July et Fred qui semble la meilleure solution :-)
Comments
1 - @ - July
En awk, cela semble un peu plus rapide (20% chez moi) :
echo -n -e $( awk '/<pre>/ { printing=1 }
( printing == 1 && NF >= 18 ) {
printf "\\x"$2 "\\x"$3 "\\x"$4 "\\x"$5 "\\x"$6 "\\x"$7 "\\x"$8 "\\x"$9 "\\x"$10 "\\x"$11 "\\x"$12 "\\x"$13 "\\x"$14 "\\x"$15 "\\x"$16 "\\x"$17
}
( printing == 1 && NF < 18 ) {
for (i=2; i < NF; i++ )
printf "\\x"$(i)
}
/\<\\pre\>/ { exit }' file.part ) >file.bin
jeudi 20 décembre 2012 - 00:29
2 - @ - fred
Bon, déjà, plutôt que d'enregistrer sous en html, pourquoi ne pas enregistrer sous en txt ?
Ensuite, tu connais ptêtre pas xxd, mais il sait faire comme hexdump, en reverse : xxd -r, du coup, y a juste à transformer au bon format…
Puis sinon, c'est louche, mais mon sed (4.2.1) garde le pattern </pre> en dernière ligne de ta première commande… (awk aussi en fait)
À part ça, en awk je pense que tu devrais te faire moins chier:
awk '/<pre>/,/<\/pre>/{for(i=2;i<=NF-1;i++){printf("%x",$i)}}'
Bon, c'est pas vraiment bon, y a un souci sur la dernière ligne qui ne se comporte pas comme les autres… du coup, en trichant avec un cut préliminaire :
awk '/<pre>/,/<\/pre>/' file.part |cut -d' ' -f3-33 | awk '{for(i=2;i<=NF;i++){printf("%x",$i)}}'
(je passais par un
{for(i=2;i<=NF-1;i++){a=a$i}}END{print a}
au début, et j'allais mettre ton sed \x après, j'oubliais que awk, c'est top ;])Bon, j'ai un peu rien testé tout comme il faut, mais l'idée est là !
jeudi 20 décembre 2012 - 00:56
3 - @ - Tontof
@July : Chez moi, c'est facile 30% plus rapide avec awk
@fred : Pour l'enregistrement c'est un fichier txt en html ? (ou lapin compris). Sinon, non je connaissais pas xxd, c'est génial, ça évite le echo qui prend le plus de temps
(Du coup j'ai édité l'article pour améliorer tout ça, merci à tous les 2)
jeudi 20 décembre 2012 - 07:30
4 - @ - July
Pour le soucis initial, c'est cut qui ne fait rien si le nombre de champs sur une ligne est inférieur à ceux demandés.
jeudi 20 décembre 2012 - 10:48