Comment ajouter un pourcentage de progression de téléchargement de fichier youtube-dl à la barre de progression de zenity
exemple de code (juste un exemple, pas un qui fonctionne)
#!/bin/sh
(
progress=$(youtube-dl --extract-audio --audio-quality 0 --newline --audio-format mp3 https://www.youtube.com/playlist?list=PL1C815DB73EC2678E)
per=$(awk '{print perc}' <<<$progress)
time=$(awk '{print time}' <<<$progress)
file_no=$(awk '{print file_no}' <<<$progress) #only for playlist, example=Downloading video 1 of 4
echo "$per" ; sleep 1
echo "# $file_no \n Time Left: $time" ; sleep 1
) |
zenity --progress \
--title="Download" \
--text="Downloading..." \
--percentage=0
if [ "$?" = -1 ] ; then
zenity --error \
--text="Download cancelled."
fi
j'ai utilisé ce code pour connaître la progression du téléchargement
youtube-dl --extract-audio --audio-quality 0 --newline --audio-format mp3 https://www.youtube.com/playlist?list=PL1C815DB73EC2678E
C'est la sortie
[youtube:playlist] PL1C815DB73EC2678E: Downloading webpage
[download] Downloading playlist: Less than 1 minute
[youtube:playlist] playlist Less than 1 minute: Collected 4 video ids (downloading 4 of them)
[download] Downloading video 1 of 4
[youtube] KNLwsqzFfNg: Downloading webpage
[youtube] KNLwsqzFfNg: Extracting video information
[youtube] KNLwsqzFfNg: Downloading DASH manifest
download] Destination: _1 min. - Amendes pour les particules du LHC-KNLwsqzFfNg.m4a
[download] 0.4% of 231.51KiB at 6.10KiB/s ETA 00:30
[download] 1.1% of 231.51KiB at 27.07KiB/s ETA 00:10
[download] 4.0% of 231.51KiB at 19.24KiB/s ETA 00:04
[download] 6.5% of 231.51KiB at 75.06KiB/s ETA 00:03
[download] 13.4% of 231.51KiB at 98.22KiB/s ETA 00:03
[download] 28.7% of 231.51KiB at 81.40KiB/s ETA 00:02
[download] 61.7% of 231.51KiB at 91.56KiB/s ETA 00:01
[download] 86.2% of 231.51KiB at 82.96KiB/s ETA 00:00
[download] 100.0% of 231.51KiB at 73.21KiB/s ETA 00:00
[download] 100% of 231.51KiB in 00:02
[ffmpeg] Correcting container in "_1 min. - Amendes pour les particules du LHC-KNLwsqzFfNg.m4a"
WARNING: Your copy of avconv is outdated, update avconv to version 10-0 or newer if you encounter any errors.
[avconv] Destination: _1 min. - Amendes pour les particules du LHC-KNLwsqzFfNg.mp3
WARNING: Your copy of avconv is outdated, update avconv to version 10-0 or newer if you encounter any errors.
Deleting original file _1 min. - Amendes pour les particules du LHC-KNLwsqzFfNg.m4a (pass -k to keep)
[download] Downloading video 2 of 4
[youtube] wTvXkMpJflk: Downloading webpage
[youtube] wTvXkMpJflk: Extracting video information
[youtube] wTvXkMpJflk: Downloading DASH manifest
etc..
etc..
.
.
et je veux seulement
Downloading video 1 of 4 [download] Downloading video 2 of 4
comme $ files_no
PREMIER FICHIER
file_no= Downloading video 1 of 4
per time rate
0.40% 00:30:00 6.10KiB/s
1.10% 00:10:00 27.07KiB/s
4.00% 00:04:00 19.24KiB/s
6.50% 00:03:00 75.06KiB/s
13.40% 00:03:00 98.22KiB/s
28.70% 00:02:00 81.40KiB/s
61.70% 00:01:00 91.56KiB/s
86.20% 00:00:00 82.96KiB/s
100.00% 00:00:00 231.51KiB/s
DEUXIEME, TROISIEME ... FICHIERS
En tant que variable séparée $ fichier, $ per, $ time, je sais que nous pouvons utiliser awk
, mais pour cette sortie compliquée, comment dois-je l'utiliser. Si tous les paramètres ne sont pas possibles, vous pouvez au moins extraire pourcentage et file_no.
Oui c'est possible. Tu dois
#
au début de la ligne. Zenity mettra automatiquement à jour le texte de sa boîte de dialogue avec les lignes commençant par #
.En combinant ce qui précède et en appliquant un peu de magie regex, nous obtenons:
#!/bin/bash
youtube-dl --extract-audio --audio-quality 0 --newline --audio-format mp3 \
https://www.youtube.com/playlist?list=PL1C815DB73EC2678E |
grep --line-buffered -oP '^\[download\].*?\K([0-9.]+\%|#\d+ of \d)' |
zenity --progress \
--title="Download" \
--text="Downloading..." \
--percentage=0
L'option --line-buffered
permet à grep
d'imprimer immédiatement sa sortie, ce qui désactive la mise en mémoire tampon par défaut. Le -o
lui permet d'imprimer uniquement la partie correspondante de la ligne et le -P
active les expressions régulières compatibles Perl.
La regex est un peu complexe, alors décomposons-la:
^\[download\]
: correspond aux lignes commençant par [download]
..*?
: 0 ou plusieurs caractères, mais le ?
le fait s'arrêter à la correspondance la plus courte possible.\K
: il s'agit fondamentalement d'un lookbehind , cela signifie "ignorer tout ce qui correspond jusqu'à présent".(...|...)
: le |
signifie OU. Par conséquent, (A|B)
correspondra à A ou à B.[0-9.]+\%
: 1 ou plusieurs chiffres ou .
suivi d'un %
. Ceci imprime le pourcentage.#\d+ of \d
: un #
suivi d'un ou de plusieurs chiffres, of
, puis à nouveau d'un ou de plusieurs chiffres. Ceci correspond à la ligne "Vidéo X de Y".Pris ensemble, cette commande grep
affichera:
#1 of 4
0.1%
0.3%
0.8%
1.7%
3.4%
7.0%
14.0%
28.2%
56.5%
99.5%
100.0%
100%
#2 of 4
0.1%
0.3%
0.8%
1.6%
3.4%
6.9%
13.9%
27.8%
55.8%
[...]
etc, et c’est précisément le résultat dont zenity
a besoin. Enfin, vous pouvez rendre le tout plus utile en implémentant la possibilité de spécifier plusieurs URL à partir de la ligne de commande:
#!/bin/bash
for url in "$@"
do
youtube-dl --extract-audio --audio-quality 0 --newline --audio-format mp3 \
https://www.youtube.com/playlist?list=PL1C815DB73EC2678E |
grep --line-buffered -oP '^\[download\].*?\K([0-9.]+\%|#\d+ of \d)' |
zenity --progress \
--title="Download" \
--text="Downloading..." \
--percentage=0
done
Ensuite, vous pouvez appeler votre script comme suit:
myscript.sh "http://url1.com" "http://url2.com" "http://urlN.com