it-swarm.com.de

youtube-dl Datei Download Fortschritt mit Zenity Fortschrittsbalken

So fügen Sie den Prozentsatz für den Download-Fortschritt von YouTube-dl-Dateien zur Zenity-Statusanzeige hinzu

beispielcode (nur ein Beispiel, kein funktionierender)

#!/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

ich habe diesen Code verwendet, um den Download-Fortschritt zu erhalten

youtube-dl --extract-audio --audio-quality 0 --newline --audio-format mp3 https://www.youtube.com/playlist?list=PL1C815DB73EC2678E

Dies ist die Ausgabe

[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..
.
.

und ich will nur

Downloading video 1 of 4 [download] Downloading video 2 of 4

als $ files_no

ERSTE DATEI

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

ZWEITE, DRITTE ... DATEIEN

Als separate Variable $ file, $ per, $ time können wir awk verwenden, aber für diese komplizierte Ausgabe, wie soll ich es verwenden. Wenn nicht alle Parameter möglich sind, kann mindestens der Prozentsatz und file_no extrahiert werden.

4
potholiday

Ja, es ist möglich. Du musst

  1. Stellen Sie sicher, dass die Ausgabe nicht gepuffert ist und sofort nach dem Empfang gedruckt wird. Pipes werden standardmäßig gepuffert.
  2. Analysieren Sie die Ausgabe des Downloaders, damit nur die Prozentsätze gedruckt werden.
  3. Analysieren Sie die Ausgabe so, dass die Dateinummer mit einem # am Zeilenanfang gedruckt wird. Zenity aktualisiert den Text seines Dialogfelds automatisch mit Zeilen, die mit # beginnen.

Wenn wir das Obige kombinieren und ein wenig Regex-Magie implementieren, erhalten wir:

#!/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 

Erläuterung

Die Option --line-buffered bewirkt, dass grep die Ausgabe sofort druckt und die Standardpufferung deaktiviert. Mit dem -o wird nur der übereinstimmende Teil der Zeile gedruckt, und mit dem -P werden Perl-kompatible reguläre Ausdrücke aktiviert.

Der reguläre Ausdruck ist ein wenig komplex, also lasst es uns zusammenfassen:

  • ^\[download\]: Stimmt mit Zeilen überein, die mit [download] beginnen.
  • .*?: 0 oder mehr Zeichen, aber der ? stoppt bei der kürzestmöglichen Übereinstimmung.
  • \K: Dies ist im Grunde ein Lookbehind , es bedeutet "alles ignorieren, was bisher gefunden wurde".
  • (...|...): der | bedeutet ODER. Daher wird (A|B) entweder A oder B entsprechen.
  • [0-9.]+\%: 1 oder mehr Zahlen oder . gefolgt von %. Dies gibt den Prozentsatz aus.
  • #\d+ of \d: ein # gefolgt von einer oder mehreren Ziffern, of und dann erneut einer oder mehreren Ziffern. Dies entspricht der Zeile "Video X von Y".

Zusammengenommen gibt der Befehl grep Folgendes aus:

#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, und das ist genau die Ausgabe, die zenity benötigt. Schließlich können Sie das Ganze noch nützlicher machen, indem Sie die Möglichkeit implementieren, mehrere URLs über die Befehlszeile anzugeben:

#!/bin/bash
for url in "[email protected]"
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

Dann können Sie Ihr Skript folgendermaßen aufrufen:

myscript.sh "http://url1.com" "http://url2.com" "http://urlN.com
4
terdon