Linux Shell Aufruf youtube-dl funktioniert nur teilweise
Verfasst: 12.05.2019 21:17
				
				Einen schönen Abend,
mein Programm ist jetzt soweit fertig, allerdings funktioniert der Aufruf des youtube-dl Konsolenprogramm nur manchmal.
Hab zuerst einen Fehler mit Rechte Vergabe vermutet, das Standalone Programm macht aber denselben Blödsinn.
Wenn ich das Programm starte und mit ps ax die laufenden Prozesse ansehe, stell ich fest, dass der Downloadstring nicht an youtube-dl übergeben wird. An den Titeln liegt's nicht, auf der Shell lässt sich alles runter laden.
Wenn ich den Downloadstring in ein Textfile schreibe (chmod 755) und dieses dann von Purebasic aufrufe funktionierts ebenfalls.
Ist mir echt ein Rätsel...
Dann würde ich gerne die Konsolenausgabe des youtube Prozesses abfangen und weiter verarbeiten.
z.B. könnte ich mit "youtube-dl --extract-audio Adress$" die Titelinformationen auslesen, weiss nur nicht wie...
Mit XBasic lief das alles problemlos, aber das sind eben die kleinen feinen Unterschiede zwischen den Basic Dialekten...
Ich dank schon mal im Vorab
Kurt
			mein Programm ist jetzt soweit fertig, allerdings funktioniert der Aufruf des youtube-dl Konsolenprogramm nur manchmal.
Hab zuerst einen Fehler mit Rechte Vergabe vermutet, das Standalone Programm macht aber denselben Blödsinn.
Wenn ich das Programm starte und mit ps ax die laufenden Prozesse ansehe, stell ich fest, dass der Downloadstring nicht an youtube-dl übergeben wird. An den Titeln liegt's nicht, auf der Shell lässt sich alles runter laden.
Wenn ich den Downloadstring in ein Textfile schreibe (chmod 755) und dieses dann von Purebasic aufrufe funktionierts ebenfalls.
Ist mir echt ein Rätsel...
Dann würde ich gerne die Konsolenausgabe des youtube Prozesses abfangen und weiter verarbeiten.
z.B. könnte ich mit "youtube-dl --extract-audio Adress$" die Titelinformationen auslesen, weiss nur nicht wie...
Mit XBasic lief das alles problemlos, aber das sind eben die kleinen feinen Unterschiede zwischen den Basic Dialekten...
Ich dank schon mal im Vorab
Kurt
Code: Alles auswählen
EnableExplicit
Enumeration
  #MainScreen
  #DL01_1 = 1
  #DL01_2 = 2  
  #DL01_3 = 3  
  #DL01_4 = 4
  #DL01_5 = 5
  #DL01_6 = 6  
  #DL01_7 = 7
  #DL01_8 = 8  
  #DL01_9 = 9  
  #BtnAdd
  #BtnDownload
  #BtnDel
  #BtnClear
  #BtnExit
  #LabAdr
  #BtnYesNo
  #MeinTimer
EndEnumeration
Procedure Open_MainScreen()
    OpenWindow(#MainScreen, 1157, 162, 600, 440, "Youtube Downloader")
    CheckBoxGadget(#DL01_1, 0, 0, 500, 25, "")
    CheckBoxGadget(#DL01_2, 0, 25, 500, 25, "")    
    CheckBoxGadget(#DL01_3, 0, 50, 500, 25, "")    
    CheckBoxGadget(#DL01_4, 0, 75, 500, 25, "")    
    CheckBoxGadget(#DL01_5, 0, 100, 500, 25, "")    
    CheckBoxGadget(#DL01_6, 0, 125, 500, 25, "")    
    CheckBoxGadget(#DL01_7, 0, 150, 500, 25, "")
    CheckBoxGadget(#DL01_8, 0, 175, 500, 25, "")    
    CheckBoxGadget(#DL01_9, 0, 200, 500, 25, "")    
    ButtonGadget(#BtnAdd, 0, 270, 100, 25, "Hinzufügen")
    ButtonGadget(#BtnDownload, 100, 270, 100, 25, "Download")
    ButtonGadget(#BtnDel, 200, 270, 100, 25, "Löschen")
    ButtonGadget(#BtnClear, 300, 270, 100, 25, "Lösche Alles")
    ButtonGadget(#BtnExit, 500, 270, 100, 25, "Ende")
    StringGadget(#LabAdr, 0, 233, 600, 25, "")
    CheckBoxGadget(#BtnYesNo,200,233,50,25, "Ich bin sicher")
    HideGadget(#BtnYesNo,1)
    AddWindowTimer(#MainScreen, #MeinTimer, 100) ;1000ms= 1sec
  EndProcedure
Open_MainScreen()
Define.l Event, EventWindow, EventGadget, EventType, EventMenu
Global DelFlag, i, Marker, Adress$, ShellPrg
Declare AddAdresse()
Declare Download()
Declare Delete()
Declare ClearAll()
Declare Programmende()
; Event Schleife
Repeat
  Event = WaitWindowEvent()
  Select Event
      Case #PB_Event_Timer
         If EventTimer()=#MeinTimer
            If Marker
                i+1
                  Download()
            EndIf
         EndIf
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    Case #PB_Event_Menu
      EventMenu = EventMenu()
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++      
      If EventGadget = #BtnAdd              
          AddAdresse()
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++              
      ElseIf EventGadget = #BtnDownload
          HideGadget(#BtnYesNo,1)  
            For i=1 To 9      
                If (GetGadgetState (i)) = 1     ; wenn selektiert
                  DelFlag=1                     ; setze Flag
                EndIf     
            Next
            If Delflag = 0
              SetGadgetText (#LabAdr, "Kein Download selektiert oder vorhanden!")          
              While WindowEvent():Wend          ; updaten       
              Delay(2000)
              SetGadgetText (#LabAdr, "")             
              Marker=#False
            Else
              i=0
              Marker=#True              
            EndIf
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      ElseIf EventGadget = #BtnDel
          HideGadget(#BtnYesNo,1)  
              For i=1 To 9      
                If (GetGadgetState (i)) = 1     ; wenn selektiert
                  DelFlag=1                     ; setze Flag
                EndIf     
              Next
          Delete()
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      ElseIf EventGadget = #BtnClear
          ClearAll()
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      ElseIf EventGadget = #BtnExit
          CloseWindow(#MainScreen)
          End
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      ElseIf EventGadget = #LabAdr
      EndIf
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
        If EventWindow = #MainScreen
          CloseWindow(#MainScreen)
          End
        EndIf
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++        
  EndSelect
;        Delay(10)  
ForEver
Procedure AddAdresse()
    HideGadget(#BtnYesNo,1)  
    Adress$ = GetGadgetText (#LabAdr)           ; Adresse aus dem Textlabel
       If Adress$ < > ""                        ; wenn nichts eingegeben wurde...
          For i=1 To 9      
             If (GetGadgetText (i)) = ""        ; Wenn der Platz noch frei ist
                SetGadgetText ((i), Adress$)    ; Adresse in die Tabelle schreiben
                SetGadgetText (#LabAdr, "")
                Break
             EndIf     
          Next
       EndIf                                    ; ...gibts auch nix zu tun
EndProcedure  
Procedure Delete()
    If DelFlag=0
      SetGadgetText (#LabAdr, "Nichts zum löschen selektiert oder vorhanden!")          
      While WindowEvent():Wend ; updaten       
      Delay(2000)
      SetGadgetText (#LabAdr, "")             
      While WindowEvent():Wend                  ; updaten             
        ElseIf (GetGadgetState(#BtnYesNo)) = 0
          HideGadget(#BtnYesNo,0)               ; Button sichtbar machen
          SetGadgetText (#LabAdr, "Markierte Downloads löschen ")                    
          While WindowEvent():Wend              ; updaten       
        Else
          For i=1 To 9
            If (GetGadgetState (i)) = 1         ; wenn der Satus 1
              SetGadgetText ((i), "")           ; Text löschen
              SetGadgetState ((i),0)            ; und Status zurück setzen
            EndIf
          Next
              SetGadgetText (#LabAdr, "Markierte Downloads gelöscht!")
              SetGadgetState(#BtnYesNo,0)       ; Flag für Auswertung löschen
              HideGadget(#BtnYesNo,1)           ; Button verstecken
              While WindowEvent():Wend          ; updaten       
              Delay(2000)
              SetGadgetText (#LabAdr, "")             
      EndIf
      DelFlag=0
EndProcedure
Procedure ClearAll()
    HideGadget(#BtnYesNo,0)  
    SetGadgetText (#LabAdr, "Alle Downloads löschen")
    While WindowEvent():Wend                    ; updaten       
    Delay(2000)    
      If (GetGadgetState(#BtnYesNo)) = 0
        ProcedureReturn
        Else
          For i=1 To 9
            SetGadgetText ((i), "")                 ; Textfeld und
            SetGadgetState ((i),0)                  ; Status löschen
            While WindowEvent():Wend ; updaten       
          Next
            SetGadgetText (#LabAdr, "")           ; Label löschen
            SetGadgetState (#BtnYesNo,0)          ; Flag für Auswertung löschen
            HideGadget(#BtnYesNo,1)               ; Button verstecken
      EndIf 
    DelFlag=0
    SetGadgetText (#LabAdr, "")
    HideGadget(#BtnYesNo,1)      
    While WindowEvent():Wend ; updaten           
EndProcedure  
Procedure Download()
    If i < 10  
      Adress$ = GetGadgetText (i)
      If Adress$ =""
        ProcedureReturn
      EndIf
      SetGadgetText(#LabAdr, "Lade " + Adress$)
      While WindowEvent():Wend          ; updaten       
      Delay(1000)         
ShellPrg= RunProgram("youtube-dl", Chr(32) + Adress$, ".",  #PB_Program_Open|#PB_Program_Write|#PB_Program_Read)
Repeat
  Debug ReadProgramString(ShellPrg)
Until Not ProgramRunning(ShellPrg)
         SetGadgetText(#LabAdr, "Lade " + Adress$)
         While WindowEvent():Wend          ; updaten       
         Delay(1000)         
         ProcedureReturn
    Else
      SetGadgetText(#LabAdr, "fertig")
      While WindowEvent():Wend          ; updaten       
    EndIf
    
For i=1 To 9
      SetGadgetText ((i), "")             ; Textfeld und
      SetGadgetState ((i),0)              ; Status löschen
    Next
      SetGadgetText (#LabAdr, "")         ; Label löschen
      SetGadgetState (#BtnYesNo,0)        ; Flag für Auswertung löschen
      HideGadget(#BtnYesNo,1)             ; Button verstecken
      DelFlag=0
      Marker=#False
EndProcedure