web-dev-qa-db-fra.com

Progression du téléchargement de fichier youtube-dl avec barre de progression zenity

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.

4
potholiday

Oui c'est possible. Tu dois

  1. Assurez-vous que la sortie n'est pas tamponnée, qu'elle est imprimée dès sa réception. Les pipes sont tamponnées par défaut.
  2. Analyser la sortie du téléchargeur de sorte que seuls les pourcentages soient imprimés;
  3. Analyser la sortie pour que le numéro de fichier soit imprimé avec un # 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 

Explication

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
4
terdon