Aus Raspberry Pi Geek 08/2022

Download-Manager für die Shell (Seite 3)

Listing 8

Download-Funktion

function download () {
  name=$(basename $1)
  endung=$(cut -f 2 -d "." <<<${name})
  [ ! -e ${download_verzeichnis}/${endung} ] && mkdir ${download_verzeichnis}/${endung}
  cd ${download_verzeichnis}/${endung} && dateien_im_verzeichnis=$(ls)
  zukuenftiger_name=$(umbenennen $name $dateien_im_verzeichnis)
  wget -O $zukuenftiger_name $1
}

Der Inhalt aus Listing 9 dient zum Generieren des Menüs, das die möglichen Downloads auflistet. In dieser Funktion startet eine Schleife, die das Array indizierte_downloads durchläuft und die Größe sowie den Basisnamen, die der Index des Arrays enthält, in jeweils einer Zeile ausgibt. Das Ende der Schleife in Zeile 6 übergibt dann alles mittels einer Pipe an Gawk.

Mit der Option -f cutter.awk weiß Gawk, welche Awk-Datei es als Programmtext verwenden muss. Als zusätzliche Option steht im Aufruf --assign frei=${frei}. Das sorgt dafür, dass das Gawk-Skript den zuvor in der Bash ermittelten Umfang des freien Speicherplatzes kennt. Gawk untersucht dann jeweils in einer Zeile die Dateigröße sowie den Basisnamen und wertet sie Zeile für Zeile aus.

Listing 9

Menü

function menu () {
  for index in ${!indizierte_downloads[@]}; do
    local base_name=$(basename ${indizierte_downloads[$index]})
    local groesse=${index}
    echo "${groesse} ${base_name}"
  done | gawk --assign frei=${frei} -F " " -f cutter.awk
}

Formatierte Anzeigen

Listing 10 zeigt im Gawk-Skript zunächst zwei selbst definierte Funktionen. cutter dient dazu, lange Basisnamen für die Anzeige zu kürzen, indem es sie in zwei Teile zerlegt und dazwischen drei Punkte einfügt. Die zweite Funktion erzeugt Trennlinien in der Anzeige, um bei Download-Seiten mit vielen Links die Übersicht zu erhöhen.

Der Block BEGIN definiert grundlegende Dinge und Überschriftenformate. Darüber hinaus zeigt er in der Zeile nach der Überschrift den freien Platz auf der Festplatte beziehungsweise im Home-Verzeichnis an.

Der Befehlsblock ohne Angabe eines Patterns in den Zeilen 21 bis 27 arbeitet schließlich die einzelnen Zeilen ab, wobei im ersten Feld die Download-Größe (in KByte, MByte und GByte) erscheint und im zweiten der Basisname. Das erweist sich dann als nützlich, wenn Sie kleinere Dateien herunterladen, wie Wallpapers, E-Books oder MP3-Dateien. Eine Angabe beispielsweise nur in GByte würde hier nicht viel Sinn ergeben. Dieser Befehlsblock berechnet auch den Gesamtumfang aller Downloads und gibt ihn schließlich über den END-Block aus (Abbildung 1).

Abbildung 1: Die formatierte Ausgabe zeigt die bereitgestellten Dateien einer Webseite. Die Auswahl erfolgt &uuml;ber die Eingabe der vorangestellten Nummern.

Abbildung 1: Die formatierte Ausgabe zeigt die bereitgestellten Dateien einer Webseite. Die Auswahl erfolgt über die Eingabe der vorangestellten Nummern.

Listing 10

cutter.gawk

function cutter( wort ){
  l = length(wort)
  part1 = substr(wort,1,8)
  part2 = substr(wort,l-22)
  return part1"..."part2
}
function trennlinie ( kleiner_gleich ) {
  for ( p = 0; p <= kleiner_gleich ; p++){
    printf "%s" (p == kleiner_gleich ? "\n" : "") ,"="
  }
}
BEGIN {
  i = 1
  printf "%8s %18s      %10s   %13s     %s\n", "Download", "Kilobyte", "Megabyte", "Gigabyte", "Dateiname"
  printf "%-5s %21.2f      %10.2f   %13.2f     %s\n", "Disk:", frei, frei/1024, frei/(1024*1024),"home bzw. /"
  trennlinie(75)
}
{
  if ( length($2) > 40 ) {
    $2 = cutter($2)
  }
  printf "%2i => %21.2f   %13.2f   %13.2f     %s\n", i++, $1/1024, $1/(1024*1024), $1/(1024*1024*1024), $2
  summe += $1
}
END {
  trennlinie(75)
  printf "Summen: %19.2f   %13.2f   %13.2f     Alle Downloads zusammen\n", summe/1024, summe/(1024*1024), summe/(1024*1024*1024)
}

Steuerung

Schließlich gibt es auch eine Art Hauptfunktion, die den gesamten Programmablauf steuert (Listing 11). Sobald Sie mit [Strg]+[C] eine URL aus dem Browser kopieren, greift Xclip darauf zu (Zeile 1).

Verwendet die grafische Oberfläche mehrere Zwischenablagen, wie das etwa Fvwm tut, müssen Sie mit der Option -selection primary oder secondary explizit angeben, welche davon Xclip berücksichtigt. Nach dem Erfassen der Zwischenablage prüft das Skript, ob die URL auch mit dem Inhalt der Zwischenablage gefüllt wurde. Falls die URL die Länge null hat, bricht das Programm den Vorgang ab.

Die Zeilen 11 bis 16 prüfen dann, ob auf der Seite überhaupt Download-Links erfasst wurden und sich ausgegeben lassen. Gibt es keine relevanten Dateien zum Herunterladen, bricht das Skript auch an dieser Stelle ab.

Zu guter Letzt arbeitet dann eine For-Schleife alle Downloads ab, prüft deren Größen und vergleicht sie mit der freien Kapazität der Festplatte. Übersteigt der Umfang der ausgewählten Downloads die verfügbare Speichergröße, bricht das Skript ab.

Listing 11

Hauptfunktion

url=$(xclip -o 2>/dev/null)
if [ -z $url ]; then
  warn "Keine URL vorhanden."
  warn "URL aus Browser mit [Strg]+[C] in die Zwischenablage kopieren."
  exit 1
fi
erfassung
if [ ${#download_links[@]} -gt 0 ]; then
  menu
  read -p "Dateien auswählen (Beispiel: 1,2,3-8,10 ): " auswahl
else
  warn "KEINE DOWNLOADS VORHANDEN" && exit 1
fi
declare -i gesamtgroesse_dowloads=0
for wahl in $(splitter $auswahl); do
  gesamtgroesse_dowloads+=${indizierte_indexe[((wahl - 1))]}
  aktueller_download=${indizierte_downloads[${indizierte_indexe[((wahl - 1))]}]}
  if [[ ${frei}-5000 -lt ${gesamtgroesse_dowloads}/1024 ]]; then
    warn "Zu wenig Speicherplatz."
    warn "${aktueller_download} wird abgebrochen."
    exit 1
  else
    download $aktueller_download
  fi
done

Da es genügt, die URL, in der Sie nach Downloads suchen, aus der Adresszeile des Browsers herauszukopieren und das Skript dann automatisch startet, arbeitet es mit allen Webbrowsern zusammen. Es holt sich die URL aus der Zwischenablage, wertet die Seite nach Dateien aus, die sich herunterladen lassen, und zeigt sie Ihnen nach Größe geordnet an. Sie wählen dann bequem aus, welche davon Sie herunterladen möchten.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 6 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben