Output von WGet (und anderen Programmen) einlesen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Sebert
Beiträge: 19
Registriert: 21.03.2014 19:12

Output von WGet (und anderen Programmen) einlesen

Beitrag von Sebert »

Hallo zusammen,

ich schlage mich schon länger mit dem Download von Podcasts herum.
Die Links die ich herzu aus den RSS Feeds ziehe, sind aber selten direkte Links sondern laufen
teilweise über mehrere Redirects.
"ReceiveHTTPFile" geht da ziemlich schnell in die Knie. Die HTTP Library von DarkPlayer kann da schon mehr, gibt aber bei manchen
Feeds auch auf.
Die Windows Version von WGet ist bisher noch nie gescheitert, also habe ich mich entschlossen auf dieses Pferd zu setzen.
Das Abfragen der Exitcodes um sie in meinem Programm auszugeben ist kein Problem.
Aber ich bekomme es einfach nicht hin die Ausgabe in meinem Programm auszugeben.
Insbesondere die letzte Zeile der Ausgabe, nämlich der Downloadprogress, wäre für mich interessant.
Sie soll in einem Editorgadget ausgegeben werden.

Bild

Wenn ich wget ohne Parameter starte, und das ganze nicht als Unicode kompiliere,
dann bekomme ich immerhin etwas. (Mit Unicode kommt nur Müll)

Code: Alles auswählen

OpenWindow(0, 0, 0, 512, 384, "", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
EditorGadget(0, 10, 10, 492, 364)

Wget = RunProgram("wget.exe", "", "", #PB_Program_Open | #PB_Program_Read )

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
  EndSelect
  If AvailableProgramOutput(Wget)
    String.s = ReadProgramString(Wget)
    AddGadgetItem(0, -1, String)
  EndIf
ForEver

KillProgram(Wget)
CloseProgram(Wget)
Sobald ich aber Wget eine Url als Parameter gebe, kommt nichts mehr zurück.
Auch aus den Topics (hier & im englischsprachigen Forum) werde ich nicht so recht schlau.
Habe auch schon überlegt ob man das ganze irgendwie in der Console ausgeben kann, die Console unterdrückt,
und den Consolenoutput dafür im Editorgadget ausgibt, aber das erscheint mir leicht Balabala :freak:

Grüße

Sebastian
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Output von WGet (und anderen Programmen) einlesen

Beitrag von NicTheQuick »

Also in der Manualpage von "wget" unter Linux steht unter anderem das hier:
Select the type of the progress indicator you wish to use. Legal
indicators are "dot" and "bar".

The "bar" indicator is used by default. It draws an ASCII progress
bar graphics (a.k.a "thermometer" display) indicating the status of
retrieval. If the output is not a TTY, the "dot" bar will be used
by default.
Das heißt, wenn du den Output umleitest bzw. über 'ReadProgramData()' ausliest, bekommst du nicht die Balkengrafik zu sehen, sondern Punkte. Das kannst du auch erzwingen, wenn du den Parameter "--progress=dot" setzt, zumindest heißt er unter Linux so.
Wenn du unabhängig von Unicode und Ascii sein willst, musst du die Programmausgabe mit 'ReadProgramData()' auslesen und dann mit 'PeekS(*data, #PB_Ascii)' konvertieren.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Output von WGet (und anderen Programmen) einlesen

Beitrag von ts-soft »

Unter Windows sollte noch beachtet werden, das die Rückgabe als OEM und nicht als CHAR erfolgt, also ist
die API OemToChar_() zu verwenden.

Unter Linux wird es auch nicht ASCII sein, sondern UTF-8!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Sebert
Beiträge: 19
Registriert: 21.03.2014 19:12

Re: Output von WGet (und anderen Programmen) einlesen

Beitrag von Sebert »

Danke für die Antworten und Hinweise, die kommen mir später sicher noch zu Pass.
Aber das löst trotzdem leider nicht mein Problem weshalb ich überhaupt nichts
zurückbekomme, sobald ich ein Parameter angebe.

Gibts es da Vorschläge?

Grüße

Sebastian
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Output von WGet (und anderen Programmen) einlesen

Beitrag von ts-soft »

Naja, wenn Du eine URL angibst, wird er diese downloaden und sich beenden.
Die Doku solltest Du auf jeden Falle erstmal studieren und dann probieren, bis es paßt :mrgreen:

Die integrierte Hilfe wird wohl eher nicht reichen.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Sebert
Beiträge: 19
Registriert: 21.03.2014 19:12

Re: Output von WGet (und anderen Programmen) einlesen

Beitrag von Sebert »

Hi Thomas,

verstehe deine Aussage nicht. Das downloaden mit WGet bzw. der Aufruf mit diversen Parametern zum Downloaden klappt ja ohne Probleme. Mir geht es um die Verwertung der Ausgabe in Purebasic.

Mit euren Angaben bekomme ich bei dem Aufruf ohne Parameter mittlerweile
auch mit Unicode was zurück, nämlich die Standardausgabe von Wget

Code: Alles auswählen

wget: missing URL
Usage: wget [OPTION]... [URL]...

Try `wget --help' for more options.
Mit Parameter wird zwar die Datei runtergeladen, nur kommt leider nach wie vor nichts zurück. Ob ich da jetzt dot oder bar verwende macht erstmal keinen Unterschied.

Grüße

Sebastian
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Output von WGet (und anderen Programmen) einlesen

Beitrag von NicTheQuick »

Kannst du uns mal den genauen PB-Code zeigen, den du zum Testen benutzt? Hast du den richtigen Parameter von 'RunProgram()' genutzt um den Parameter für 'wget' zu übergeben? Und hast du darauf geachtet, dass der Parameter Anführungszeichen vorne und hinten hat?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Output von WGet (und anderen Programmen) einlesen

Beitrag von ts-soft »

Hab keine Zeit, mir die Doku zu laden und zu probieren, aber das was ich bisher gesehen habe, solltest Du den
Schreibparameter mit angeben und -b für Background wohl auch.
Output lesen, nächster Befehl usw., so in etwas sollte es laufen. Evtl. auch den Errorstring lesen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Sebert
Beiträge: 19
Registriert: 21.03.2014 19:12

Re: Output von WGet (und anderen Programmen) einlesen

Beitrag von Sebert »

@ts-soft
Welche Schreibparameter? Bzw Schreibparameter von was?

Hi Thomas,

siehe Code im ersten Post für Beispiel ohne Parameter, hier Beispiel mit
Parameter. Download klappt, Wget öffnet sich, solange Flag '#PB_Program_Read' enthalten ist
zeigt es allerdings nichts/bleibt leer, sondern zeigt nur den Progress im Fenstertitel.

Code: Alles auswählen

OpenWindow(0, 0, 0, 512, 384, "", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
EditorGadget(0, 10, 10, 492, 364)

Wget = RunProgram("wget.exe", "--progress=dot http://mp3-download.swr.de/swr2/impuls/beitraege/2013/11/13-frag-den-paal.12844s.mp3", "",#PB_Program_Open  | #PB_Program_Read )

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
  EndSelect
  If AvailableProgramOutput(Wget)
    String.s = ReadProgramString(Wget)
    AddGadgetItem(0, -1, String)
  EndIf
ForEver

KillProgram(Wget)
CloseProgram(Wget)
Grüße

Sebastian
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Output von WGet (und anderen Programmen) einlesen

Beitrag von Kiffi »

@Sebert: Einige Programme (wie wget auch) schreiben ihren Output in stderr. Deshalb:

Gib Deinem RunProgram() noch das #PB_Program_Error - Flag mit und werte dann ReadProgramError() aus.

Grüße ... Kiffi
a²+b²=mc²
Antworten