Seite 1 von 3

Output von WGet (und anderen Programmen) einlesen

Verfasst: 23.04.2014 12:20
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

Re: Output von WGet (und anderen Programmen) einlesen

Verfasst: 23.04.2014 12:51
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.

Re: Output von WGet (und anderen Programmen) einlesen

Verfasst: 23.04.2014 13:04
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!

Re: Output von WGet (und anderen Programmen) einlesen

Verfasst: 23.04.2014 13:46
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

Re: Output von WGet (und anderen Programmen) einlesen

Verfasst: 23.04.2014 14:12
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

Re: Output von WGet (und anderen Programmen) einlesen

Verfasst: 23.04.2014 14:32
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

Re: Output von WGet (und anderen Programmen) einlesen

Verfasst: 23.04.2014 14:35
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?

Re: Output von WGet (und anderen Programmen) einlesen

Verfasst: 23.04.2014 14:47
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.

Re: Output von WGet (und anderen Programmen) einlesen

Verfasst: 23.04.2014 14:50
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

Re: Output von WGet (und anderen Programmen) einlesen

Verfasst: 23.04.2014 15:09
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