[PROJEKT] Automatisierter Download und Verarbeitung von Audiodateien

  • Nein, bisher habe ich Koda direkt gestartet. Da hakt es eben schon, dass ich das mit AutoIt garnicht in Verbindung bekomme.

    Der Button zum Einfügen sollte aber trotzdem vorhanden sein, nur dann eben nicht funktionieren. (Der Button hat an der Seite einen kleinen Pfeil um die anderen Optionen auswählen zu können.) Das Einfachste wäre es wahrscheinlich Koda über Alt+m direkt aus SciTE zu starten.

    Mir wurde zu beginn hier immer ins Gewissen gesprochen, dass ich den "Mehraufwand" zum erstellen der Oberflächen in kauf nehmen soll, dafür den Code aber selber schreibe. Also ich würde es so jedem anderen auch nun ans Herz legen. Wenn man es auch einige male gemacht hat, geht es von Hand ziemlich genau so fix finde ich

    Ich hatte mir auch kurz überlegt, ob ich das nicht vielleicht ansprechen sollte, dachte dann aber, dass das Projekt ja wahrscheinlich in näherer Zukunft fertig sein soll und es eben schon ein bisschen Zeit in Anspruch nimmt GUIs selbst zu programmieren bzw. das zu Lernen. (Das Programmieren selbst geht dann natürlich schneller als das Zusammenklicken mit Koda.) Aber du hast natürlich Recht.

  • Ich glaube zu wissen was ihr meint.

    Vor vielen vielen Jahren, habe ich zur Erstellung von Homepages FrontPage benutzt. Das war zu Zeiten als es noch Dinosa..... :rofl: ... nein Spaß bei Seite.

    Heute schreibe ich all meine HTML's nd PHP's usw. über das Notepad++, da es für mich schneller und fehlerfreier lläuft. Aber die Arbeit mit FP hat mir in der Anfangsphase in einigen Punkten weitergeholfen und Richtungen und Lösungen aufgezeigt. So lief das mit Koda inzwischen auch.

    Die Codes von Coda habe ich eh schon wieder per hand manipuliert :)

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Inzwischen habe ich mich durch einiges gelesen und gearbeitet.

    Nach dem Motto gut geklaut ist besser als schlecht selbst gemacht, konnte ich inzwischen den ersten Teil des FTP-Bereichs erstellen und zum größten Teil verstehe ich auch was ich tue :)

    Wichtig an dem Programm ist eben auch, dass der Moderator immer ein Feedback über den Stand und Erfolg des Downloads erhält. Dazu soll zum Beipiel für den Download eine Progress-Anzeige laufen.

    Für den FTP ist mir das auch gelungen:

    Spoiler anzeigen
    [autoit]

    #Region ### DOWNLOAD ###
    Local $Open = _FTP_Open('MyFTP Control')
    Local $Conn = _FTP_Connect($Open, $ftp_server, $ftp_user, $ftp_passwd, 0, $INTERNET_DEFAULT_FTP_PORT, $INTERNET_SERVICE_FTP, 0)
    ProgressOn ( "News Download", "Aktuelles OnAirDesign wird geladen")
    _FTP_ProgressDownload($Conn, "..\temp" & $newsopener, "News/" & $newsopener, "_UpdateProgress")
    _FTP_ProgressDownload($Conn, "..\temp" & $newscloser, "News/" & $newscloser, "_UpdateProgress")
    _FTP_ProgressDownload($Conn, "..\temp" & $zugang, "News/" & $zugang, "_UpdateProgress")
    Local $Ftpc = _FTP_Close($Open)
    Func _UpdateProgress($percent)
    ProgressSet($percent, int($percent) & "%")
    return 1
    EndFunc ;==>_UpdateProgress
    #EndRegion ### DOWNLOAD ###

    [/autoit]

    Aber für den HTTP-Download vom Anbieter häge ich noch fest.

    Spoiler anzeigen
    [autoit]

    #Region ### DOWNLOAD ###
    ProgressOn ( "News Download", "Aktuelle News wird geladen")
    InetGet("http://" & $media_user & ":" & $media_passwd & "@" & $media_server & "/News/News.mp3", "..\temp" & $news, Default, "_UpdateProgress")
    Func _UpdateProgress($percent)
    ProgressSet($percent, int($percent) & "%")
    return 1
    EndFunc ;==>_UpdateProgress
    #EndRegion ### DOWNLOAD ###

    [/autoit]

    Irgendwo habe ich hier einen Denkfehler?

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Die letzten beiden Parameter von InetGet sind options und background, wobei für background nur die Werte 0 oder 1 in Frage kommen, eben je nach dem, ob der Download im Hintergrund laufen soll.
    Du musst also selbst mit InetGetInfo prüfen, ob der Download noch läuft und wie viel schon heruntergeladen wurde und aus diesen beiden Infos eine Schleife bauen, die deine Funktion _UpdateProgress aufruft.

  • OK das versteh ich soweit.

    Das heißt ich Starte den Progress, anschließend den Download. Danach kommt eine While-Schleife in der mittels InetGetInfo solange der Status des Downlods abgefragt wird bis die 100% erreicht wurden. Und bei jedem Durchlauf wird die Progress-Anzeige erhöht. Erst dann wird die Schleife beendet?

    Spoiler anzeigen
    [autoit]

    #Region ### DOWNLOAD ###
    ProgressOn ( "News Download", "Aktuelle News wird geladen")
    InetGet("http://" & $media_user & ":" & $media_passwd & "@" & $media_server & "/News/News.mp3", "..\temp" & $news, Default, 0)
    Local $DLstate = InetGetInfo(Default, 1)
    While $DLstate not True
    Func _UpdateProgress($percent)
    ProgressSet($percent, int($percent) & "%")
    return 1
    EndFunc ;==>_UpdateProgress
    WEnd
    #EndRegion ### DOWNLOAD ###

    [/autoit]

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Fast.
    1) Du musst den Rückgabewert von InetGet einer Variable zuweisen und diese dann auch bei InetGetInfo verwenden.
    2) Du musst bei jedem Schleifendurchlauf abfragen, ob der Download fertig ist, d.h. InetGetInfo in den Schlefenkopf packen.
    3) $DLstate not True funktioniert nicht, richtig wäre Not InetGetInfo($Download, 1).
    4) Du kannst Funktionen nicht in Schleifen deklarieren. Die Funktionen sollten alle am Ende des Skriptes stehen, du musst sie nur in der Schleife aufrufen. Dafür brauchst du dann natürlich wieder einen Wert von InetGetInfo.

  • Ich habe vermutlich noch eine falsche Denkweise aus cmd.

    Das heißt eine Funktion wird nur ausgeführt, wenn sie an einer anderen Stelle aufgerufen wurde?

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Genau, denn eine Funktion ist ja eigentlich dazu da um Anweisungen zusammenzufassen und das Skript kürzer und übersichtlicher zu machen, was in deinem Versuch nicht gegeben wäre.

  • Also ich habe jetzt nochmal einiges gelesen und gegoogelt und und und :D

    Ist folgendes richtig?
    - Eine Funktion steht normal nach dem Exit ?
    - Die Funktion kann über ihre Bezeichnung (in meinem Fall "_UpdateProgress") auch öfter aufgerufen werden?

    Das ganze würde dann wie folgt aussehen:

    Spoiler anzeigen
    [autoit]

    #Region ### DOWNLOAD ###
    Local $Open = _FTP_Open('MyFTP Control')
    Local $Conn = _FTP_Connect($Open, $ftp_server, $ftp_user, $ftp_passwd, 0, $INTERNET_DEFAULT_FTP_PORT, $INTERNET_SERVICE_FTP, 0)
    ProgressOn ( "News Download", "Aktuelles OnAirDesign wird geladen")
    _FTP_ProgressDownload($Conn, "..\temp" & $newsopener, "News/" & $newsopener, "_UpdateProgress")
    _FTP_ProgressDownload($Conn, "..\temp" & $newscloser, "News/" & $newscloser, "_UpdateProgress")
    _FTP_ProgressDownload($Conn, "..\temp" & $zugang, "News/" & $zugang, "_UpdateProgress")
    Local $Ftpc = _FTP_Close($Open)

    [/autoit] [autoit][/autoit] [autoit]

    ProgressOn ( "News Download", "Aktuelle News wird geladen")
    Local $DLGet = InetGet("http://" & $media_user & ":" & $media_passwd & "@" & $media_server & "/News/News.mp3", "..\temp" & $news, Default, 0)
    While Local $DLstate = InetGetInfo($DLGet, 1)
    ; ?????
    WEnd
    Local InetClose($DLGet)
    #EndRegion ### DOWNLOAD ###

    [/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Func _UpdateProgress($percent)
    ProgressSet($percent, int($percent) & "%")
    return 1
    EndFunc ;==>_UpdateProgress

    [/autoit]

    Was mir aber noch gänzlich unklar ist, wie ruf ich in der Schleife die Funktion auf? (siehe ????)

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Ist folgendes richtig?
    - Eine Funktion steht normal nach dem Exit ?
    - Die Funktion kann über ihre Bezeichnung (in meinem Fall "_UpdateProgress") auch öfter aufgerufen werden?

    1) Der Übersichtlichkeit halber ja. 2) Ja.

    [autoit]

    Local $Ftpc = _FTP_Close($Open)

    [/autoit]

    Da du diese Variable nirgends verwendest kannst du alles bis auf _FTP_Close($Open) weglassen.

    [autoit]

    While Local $DLstate = InetGetInfo($DLGet, 1)

    [/autoit]

    Das funktioniert so nicht, du kannst keine Variablen in einem Schleifenkopf deklarieren. Lösung: While InetGetInfo($DLGet, 2) (1 wäre nur die Größe des Downloads, und bei Zahlen ist <> 0 eigentlich immer True --> Endlosschleife)

    In der Schleife liest du "einfach" die schon heruntergeladen Bytes und die Größe des Downloads (wobei das vor die Schleife kann da sich der Wert nicht ändert) aus, teilst die beiden und rufst damit dann deine Funktion auf (wie jede andere auch).

  • Hi
    Ich kann aus eigener Erfahrung sagen, dass es sehr schwierig wird als "Anfänger" sehr große Projekte (relativ gesehen) zu starten.
    Das größte Problem wird wohl werden, dass AutoIt von Haus aus keine gebrauchbaren TCP/ UDP Befehle implementiert hat (Man kann geschickte Dinge verpassen!?). Da kann man nur zur Alternative mit einem DLLCall greifen, dass aber wiederrum langsam ist. Ich würde Server nie in AutoIt machen. In C++ ist das ganze vielleicht ein bisschen kompliziert am Anfang - es lohnt sich aber auf jeden Fall, da es am Ende doch wesentlich einfacher ist einen Server in C++ anstatt in AutoIt zu machen. Es ist zwar nicht unmöglich, aber ich würde es mir nicht antun (habe es schon oft genug gemacht..). Nicht zuletzt ist es eine Sache der Performanz usw.
    Viel Erfolg ;).

    Nur keine Hektik - das Leben ist stressig genug

  • Also schwierig ist nicht das Problem :)

    Ich liebe es mich an solchen Dingen fest zu beißen und freu mich dann umso mehr, wenn ich es geschafft habe.

    AntiSpeed:
    Ich versteh nicht was Du mit "...würde Server nie in AutoIt machen ...." meinst.


    Ich habe mich die letzte Nacht nochmal intensiv in die betroffenen Bereiche eingelesen, Aber ich komme bei der "While-Schleife" nicht weiter.

    Der Ablauf im zweiten Downloadsegment:
    - Bestimmen einer Variablen für die Verbindung
    - Start des Progress
    - Der eigentliche Download (inkl. Zuweisung einer Variablen)
    - Auslesen der Dateigröße über InetGetInfo (1)
    - Auslesen der geladenen Datenmenge über InetGetInfo (2)
    - Starten der While-Schleife (inkl. Vergleich geladene Daten zu den zu ladenden Daten)
    - Auslesen der geladenen Datenmenge über InetGetInfo (2) innerhalb der Schleife
    - Aufrufen der Progress-Frunktion
    - Beenden der Schleife
    - Schließen der Inet-Verbindung

    Im Prinzip funktioniert auch alles, aber die Progressbar läuft nicht, sondern wird nur angezeigt.


    Spoiler anzeigen
    [autoit]

    #Region ### DOWNLOAD ###
    Local $_S1_Open = _FTP_Open('MyFTP Control')
    Local $_S1_Conn = _FTP_Connect($_S1_Open, $ftp_server, $ftp_user, $ftp_passwd, 0, $INTERNET_DEFAULT_FTP_PORT, $INTERNET_SERVICE_FTP, 0)
    ProgressOn ( "News Download", "Aktuelles OnAirDesign wird geladen")
    _FTP_ProgressDownload($_S1_Conn, "..\temp" & $newsopener, "News/" & $newsopener, "_UpdateProgress")
    _FTP_ProgressDownload($_S1_Conn, "..\temp" & $newscloser, "News/" & $newscloser, "_UpdateProgress")
    _FTP_ProgressDownload($_S1_Conn, "..\temp" & $zugang, "News/" & $zugang, "_UpdateProgress")
    _FTP_Close($_S1_Open)
    #EndRegion ### DOWNLOAD ###
    ; #ce

    $media_server = IniRead("..\temp\zugang.ini", "sektion1", "media_server", "Nicht gefunden")
    $media_user = IniRead("..\temp\zugang.ini", "sektion1", "media_user", "Nicht gefunden")
    $media_passwd = IniRead("..\temp\zugang.ini", "sektion1", "media_passwd", "Nicht gefunden")

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### DOWNLOAD ###
    Local $_S2_Conn = ("http://" & $media_user & ":" & $media_passwd & "@" & $media_server)
    ProgressOn ( "News Download", "Aktuelle News wird geladen")
    Local $DLGet = InetGet($_S2_Conn & "/News/News.mp3", "..\temp" & $news, Default, 0)
    $DLsize = InetGetInfo($DLGet, 1)
    $DLstate = InetGetInfo($DLGet, 2)
    While $DLstate < $DLsize
    $DLstate = InetGetInfo($DLGet, 2)
    Call("_UpdateProgress", $percent)
    WEnd
    InetClose($DLGet)
    #EndRegion ### DOWNLOAD ###

    [/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Func _UpdateProgress($percent)
    ProgressSet($percent, int($percent) & "%")
    return 1
    EndFunc ;==>_UpdateProgress

    [/autoit]

    Die Reihenfolge müßte doch stimmen oder?

    Ich habe nochmal die Variablen etwas angepasst umsie für später übersichtlicher zu bekommen.

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Du lässt dir vor der Schleife die Informationen über den Download geben und dann nie wieder. Die Anzahl der heruntergeladenen Bytes ändert sich aber (hoffentlich). Also muss das in die Schleife. Außerdem versuchst du [Download fertig?] mit [heruntergeladene Bytes] zu vergleichen, was überhaupt keinen Sinn macht.
    Eigene Funktionen lassen sich übrigens genauso aufrufen wie alle anderen, d.h. Call ist nicht nötig.
    $percent musst du auch noch in der Schleife berechnen. Du verwendest die Variable zwar, deklarierst sie aber nirgends. AutoIt sollte da eigentlich auch eine Fehlermeldung ausgeben.

    Einige Sachen stimmen in deiner Liste sogar, wieso sind sie dann im Skript falsch? Und für InetGetInfo lohnt sich ein Blick in die Hilfe.

    Und AntiSpeed hat höchstwahrscheinlich aus Versehen im falschen Thema gepostet, anders kann ich mir den Text nicht erklären.

  • omg .. :) ... naja, das kommt davon wenn man bis in die Nacht werkelt :)

    Bei der Abfrage der InetGetInfo habe ich schlichtweg vergessen bei 0 zu beginnen und habe eben anstatt 0 und 1, 1 und 2 als Indexwert genommen. Sorry ... peinlicher Fehler
    Und dann auch noch verdreht ... Also wo (2) war sollte eigentlich (0) sein.

    Was ich nun aber garnicht verstehe ich Deine Aussage "Eigene Funktionen lassen sich übrigens genauso aufrufen wie alle anderen, d.h. Call ist nicht nötig." Das mit dem Aufrufen der Funktionen entzieht sich mir.

    Ich hoffe aber, dass ich gerade einen Lichtblick hatte.

    Am Anfang der Schleife prüfe ich ob der geladene Teil kleiner ist als die Datei groß ist. Wenn dem nicht so ist, müßte das Programm ja die Schleife ignorieren und direkt weiter zum Exit-Befehl gehen?
    Dann frage ich den aktuellen Download-Status ab.
    In den ächsten beiden Zeilen berechne ich wieviel Prozent der bisherige Download von der gesamt Größe hat.
    Dann wird die Variable für den Aufruf der Funktion und der Übergabewert festgelegt.
    Am Ende wird dann die Funktion aufgerufen

    Aber irgendwo liege ich noch falsch.

    Spoiler anzeigen
    [autoit]

    $DL_size = InetGetInfo($DL_Get, 1)
    $DL_state = InetGetInfo($DL_Get, 0)
    ; $DL_percent = $DL_size / 100
    While $DL_state < $DL_size
    $DL_state = InetGetInfo($DL_Get, 0)
    $DL_1percent = $DL_size / 100
    $DL_percent = $DL_state / $DL_1percent
    $DL_Func = _UpdateProgress($DL_percent)
    $DL_percent = $DL_Func
    WEnd
    InetClose($DL_Get)
    #EndRegion ### DOWNLOAD ###

    [/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Func _UpdateProgress($percent)
    ProgressSet($percent, int($percent) & "%")
    return 1
    EndFunc ;==>_UpdateProgress

    [/autoit]

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Was ich nun aber garnicht verstehe ich Deine Aussage "Eigene Funktionen lassen sich übrigens genauso aufrufen wie alle anderen, d.h. Call ist nicht nötig." Das mit dem Aufrufen der Funktionen entzieht sich mir.

    Du hast es aber trotzdem richtig gemacht. :D

    $DL_state ist vielleicht etwas ungünstig benannt, aber ansonsten sollte es funktionieren. Wie viel schon heruntergeladen wurde bräuchtest du eigentlich vor der Schleife nicht abfragen, da der Download in den paar Millisekunden sowieso nicht fertig wird. Dann müsstest du allerdings While $DL_state < $DL_size durch While InetGetInfo($DL_Get, 2) ersetzen. Das sind aber nur Kleinigkeiten, wichtig ist, dass es funktioniert.
    Wie du die Prozent berechnest verstehe ich irgendwie noch nicht so ganz, was aber nicht heißt, dass es falsch ist. Ich hätte da einfach ($DL_state / $DL_size) * 100 benutzt.
    Zeile 9 ist übrigens wieder unnötig, da deine Funktion immer 1 zurückgibt und du diesen Wert sowieso nicht verarbeitest. Zeile 6 könnte eigentlich auch vor die Schleife, da sich da auch nichts ändert.

    Aber irgendwo liege ich noch falsch.

    Fehler finde ich aber auch keine mehr.

  • WOW .. ich hab sogar alles verstanden was Du geschrieben hast :) *schulterklopf*

    Mir kommt es so vor, als würde die "While-Schleife" garnicht erst durchlaufen.

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • WOW .. ich hab sogar alles verstanden was Du geschrieben hast :) *schulterklopf*

    War das bei vorherigen Beiträgen nicht so? Sollte ich mich unklar oder (wie so oft) viel zu kompliziert ausdrücken, frag einfach nochmal nach.

    Mir kommt es so vor, als würde die "While-Schleife" garnicht erst durchlaufen.

    Vor dem Ausschnitt oben steht aber schon ProgressOn, oder?

  • Nein, das passt schon :) Ich bin ganz zufrieden ein wenig kniffeln zu können. Meiner Meinung nach setzt man sich dann intensiver damit auseinander und das Verständnis wird besser.

    Also eigentlich ist alles wie es sein soll .. Denke ich. ... Aber anscheinend wohl nicht :)

    Spoiler anzeigen
    [autoit]


    #Region ### INCLUDES ###
    #include <FTPEx.au3>
    #include <Debug.au3>
    #include <..\data\config.ini>
    #EndRegion ### INCLUDES ###

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #Region ### DOWNLOAD ###
    Local $_S1_Open = _FTP_Open('MyFTP Control')
    Local $_S1_Conn = _FTP_Connect($_S1_Open, $ftp_server, $ftp_user, $ftp_passwd, 0, $INTERNET_DEFAULT_FTP_PORT, $INTERNET_SERVICE_FTP, 0)
    ProgressOn ( "News Download", "Aktuelles OnAirDesign wird geladen")
    _FTP_ProgressDownload($_S1_Conn, "..\temp" & $newsopener, "News/" & $newsopener, "_UpdateProgress")
    _FTP_ProgressDownload($_S1_Conn, "..\temp" & $newscloser, "News/" & $newscloser, "_UpdateProgress")
    _FTP_ProgressDownload($_S1_Conn, "..\temp" & $zugang, "News/" & $zugang, "_UpdateProgress")
    _FTP_Close($_S1_Open)
    #EndRegion ### DOWNLOAD ###

    $media_server = IniRead("..\temp\zugang.ini", "sektion1", "media_server", "Nicht gefunden")
    $media_user = IniRead("..\temp\zugang.ini", "sektion1", "media_user", "Nicht gefunden")
    $media_passwd = IniRead("..\temp\zugang.ini", "sektion1", "media_passwd", "Nicht gefunden")

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### DOWNLOAD ###
    Local $_S2_Conn = ("http://" & $media_user & ":" & $media_passwd & "@" & $media_server)
    ProgressOn ( "News Download", "Aktuelle News wird geladen")
    Local $DL_Get = InetGet($_S2_Conn & "/_News/News.mp3", "..\temp" & $news, Default, 0)
    $DL_size = InetGetInfo($DL_Get, 1)
    While InetGetInfo($DL_Get, 2)
    $DL_state = InetGetInfo($DL_Get, 0)
    $DL_percent = ($DL_state / $DL_size) * 100
    $DL_Func = _UpdateProgress($DL_percent)
    WEnd
    InetClose($DL_Get)
    #EndRegion ### DOWNLOAD ###

    [/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Func _UpdateProgress($percent)
    ProgressSet($percent, int($percent) & "%")
    return 1
    EndFunc ;==>_UpdateProgress

    [/autoit]

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Kann es sein, dass sich die zwei Downloads ins Gehege kommen?

    Dass ich irgendeine Warteschleife einbauen muß, bevor der zweite Download auf die selbe Funktion zugreift?

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Kann es sein, dass sich die zwei Downloads ins Gehege kommen?

    Dass ich irgendeine Warteschleife einbauen muß, bevor der zweite Download auf die selbe Funktion zugreift?


    Nein, es scheint als würde _FTP_ProgressDownload das Skript selbstständig pausieren, bis der Download beendet ist. Die 4 Downloads sollten also bereits nacheinander ablaufen.