Youtube Downloader - iTube

  • Hallo liebe Scripter, Ich habe mal eine Kleine Funktion zum Downloaden von
    Youtube-Videos gemacht, Wie findet ihr mein Programm ?

    Kommentare und Kritik ist Erwünscht! (Auch Deswegen, Weil ich alle Vorschläge sofort Umsetzte :D )

    Hier einmal das Skript im Spoiler:

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <INet.au3>
    ;Test-URL: [media]http://www.youtube.com/watch?v=nGWrkq2Ales[/media]

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

    If (Not FileExists(@ScriptDir & "\Videos\")) Then DirCreate(@ScriptDir & "\Videos\")

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

    ;Gui Erstellen
    $hWin1 = GUICreate("iTube v1.0", 319, 93, 192, 124)
    $hLbl1 = GUICtrlCreateLabel("YouTube URL hier Eingeben :", 8, 8, 147, 17)
    $hInp1 = GUICtrlCreateInput("", 160, 8, 153, 21, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
    $hPrg1 = GUICtrlCreateProgress(8, 32, 305, 17)
    $hBtn1 = GUICtrlCreateButton("Download", 8, 56, 75, 25, $WS_GROUP)
    $hPrg2 = GUICtrlCreateProgress(88, 60, 225, 17)

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

    GUISetState(@SW_SHOW) ;GUI Anzeigen

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

    While 1
    $nMsg = GUIGetMsg() ;Controls Abfragen
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $hBtn1
    If GUICtrlRead($hInp1) = "" Then ContinueLoop
    _Download(GUICtrlRead($hInp1))

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

    EndSwitch
    WEnd

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

    Func _Download($sURL, $bHD = False)
    Local $sSource, $sTitle, $sID, $sDownloadLink, $sSWFArgs, $sSWFID, $iSize, $iCurrent, $iProzent
    $sSource = _INetGetSource($sURL)
    $sSource = StringStripCR($sSource)
    $sSource = StringReplace($sSource, @LF, '')

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

    $sTitle = StringRegExp($sSource, "'VIDEO_TITLE': '(.*?)'", 1, 1) ;Titel Auslesen
    If IsArray($sTitle) Then $sTitle = $sTitle[0] ;Anpassen
    GUICtrlSetData($hPrg2, 25)
    Sleep(500)

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

    $sID = StringRegExp($sSource, "'VIDEO_ID': '(.*?)'", 1, 1) ;ID Auslesen
    If IsArray($sID) Then $sID = $sID[0] ;Anpassen
    GUICtrlSetData($hPrg2, 50)
    Sleep(500)

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

    ;SWF ARG - Bereich auslesen
    $sSWFArgs = StringRegExp($sSource, 'SWF_ARGS(.*?)}', 1, 1)
    If IsArray($sSWFArgs) Then $sSource = $sSWFArgs[0]
    GUICtrlSetData($hPrg2, 75)
    Sleep(500)

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

    ;Code ID aus dem SWF ARG Bereich auslesen
    $sSWFID = StringRegExp($sSource, '"t": "(.*?)",', 1, 1)
    If IsArray($sSWFID) Then $sSWFID = $sSWFID[0]
    GUICtrlSetData($hPrg2, 100)
    Sleep(500)
    GUICtrlSetData($hPrg2, 0)

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

    $sDownloadLink = 'http://www.youtube.com/get_video?fmt=18&video_id=' & $sID & '&t=' & $sSWFID
    $iSize = InetGetSize($sDownloadLink)

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

    InetGet($sDownloadLink, @ScriptDir & "\Videos\" & StringRegExpReplace($sTitle, "((?<!.)([a-zA-Z]\:\\)(?!\s)(([\w-+.]*" & _
    "((?<!\s)(\s{1})(?!\\)|(?<!\\)(\\{1})(?!\s))*)*)(\\?)(?!.))", "") & ".mp4", 1, 1)

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

    While @InetGetActive = 1
    $iCurrent = @InetGetBytesRead
    $iProzent = 100 * $iCurrent / $iSize
    $iProzent = Round($iProzent, 0)

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

    GUICtrlSetData($hPrg1, $iProzent)
    Sleep(200)
    WEnd
    MsgBox(64, "iTube v1.0", $sTitle & " erfolgreich Heruntergeladen")
    Exit
    EndFunc ;==>_Download

    [/autoit]

    Und als Download: autoit.de/wcf/attachment/7171/

    Edit: Ganz Vergessen, Der Letzte Pattern, ist von BugFix's Homepage, Also von Ihm :D

  • Nicht schlecht. Habs auch schon getestet, geht perfekt, zeigt was gedownloadet wurde/wie lange es noch braucht...
    Allerdings im *.mp4 Format...
    Wär nicht schlechts wenn du es in einem Anderen Format speichern könntest.
    Win MediaPlayer / MediaCenter kann es nicht wiedergeben.
    MP3Maker kann keinen Kopierschutz erkennen, und spielt es deswegen auch nicht ab.
    Wär nicht schlecht wenn du das im *.avi Format speichern könntest,
    oder in einem, das die üblichen Abspielprogramme unterstützen.
    MfG: MasterOfTime

  • Gute Idee DjDominik.
    Ich kann dir ja mal nen kleinen Tipp geben ;D
    Habe eben nen Thema mit der Update Funktion entdeckt.
    Vieleicht kannste damit ja was anfangen.
    MfG: MasterOfTime

  • Ich habe einen Player gefunden, der *.mp4 abspielen kann,
    auch ohne Kopierschutzzerfitikat ...
    Es ist der vlc-media-player.

    MfG

  • Hi ist ja lustig ich hab gerade gestern auch einen Youtube Downloader allerdings in einem anderen Forum released: http://www.ingamers.de/autoit/release-youtube-112463.html
    Ich hab bei deinem ein Problem nämlich kommt bei mir eine Fehlermeldung wenn ich es aus dem Scite starte. Es heißt, dass "@InetGetActive " und das andere Makro von InetGet nicht existiert. Soweit ich weiß liegt da daran das ich die aktuellste Version von Autoit (3.3.2.0.) habe. Leider existieren diese Makros dort nicht.
    LG Jakolo

  • Also erst mal zum Rechtlichen:
    YouTube verbietet in seiner AGB zwar den Download von Videos, aber dieser muss man ja nur zustimmen wenn man einen YouTube Account hat.

    Dann zum Programm:
    Ich habe auch so einen YouTube loader mal geschrieben, und benutze zum Umwandeln FFMPEG.exe
    Damit kann ich dann die videos auch in das mp3 format konvertieren.

    Und hier der download-teil für alle die das neue autoit haben:

    [autoit]


    $ORISIZE = InetGetSize($sDownloadLink)
    $ihdl=InetGet($sDownloadLink, @ScriptDir & "\Videos\" & StringRegExpReplace($sTitle, "((?<!.)([a-zA-Z]\:\\)(?!\s)(([\w-+.]*" & _
    "((?<!\s)(\s{1})(?!\\)|(?<!\\)(\\{1})(?!\s))*)*)(\\?)(?!.))", "") & ".mp4", 1, 1)
    Do
    $SIZE1=InetGetInfo($ihdl, 0)
    $PROZENT = (100 * $SIZE1) / $ORISIZE
    GUICtrlSetData($hPrg1, $Prozent)
    Until $SIZE1 = $ORISIZE
    MsgBox(64, "iTube v1.0", $sTitle & " erfolgreich Heruntergeladen")
    Exit

    [/autoit]

    einfach den teil der unter :$sDownloadLink = 'http://www.youtube.com/get_video?fmt=18&video_id=' & $sID & '&t=' & $sSWFID
    durch meinen Code ersetzen

  • Kannst ja meinen Codeschnippsel verwenden, weil des is auch des einzige was da sonst nicht funzt
    Sähe dann so aus:

    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <INet.au3>
    ;Test-URL: [media]http://www.youtube.com/watch?v=nGWrkq2Ales[/media]

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

    If (Not FileExists(@ScriptDir & "\Videos\")) Then DirCreate(@ScriptDir & "\Videos\")

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

    ;Gui Erstellen
    $hWin1 = GUICreate("iTube v1.0", 319, 93, 192, 124)
    $hLbl1 = GUICtrlCreateLabel("YouTube URL hier Eingeben :", 8, 8, 147, 17)
    $hInp1 = GUICtrlCreateInput("", 160, 8, 153, 21, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
    $hPrg1 = GUICtrlCreateProgress(8, 32, 305, 17)
    $hBtn1 = GUICtrlCreateButton("Download", 8, 56, 75, 25, $WS_GROUP)
    $hPrg2 = GUICtrlCreateProgress(88, 60, 225, 17)

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

    GUISetState(@SW_SHOW) ;GUI Anzeigen

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

    While 1
    $nMsg = GUIGetMsg() ;Controls Abfragen
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $hBtn1
    If GUICtrlRead($hInp1) = "" Then ContinueLoop
    _Download(GUICtrlRead($hInp1))

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

    EndSwitch
    WEnd

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

    Func _Download($sURL, $bHD = False)
    Local $sSource, $sTitle, $sID, $sDownloadLink, $sSWFArgs, $sSWFID, $iSize, $iCurrent, $iProzent
    $sSource = _INetGetSource($sURL)
    $sSource = StringStripCR($sSource)
    $sSource = StringReplace($sSource, @LF, '')

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

    $sTitle = StringRegExp($sSource, "'VIDEO_TITLE': '(.*?)'", 1, 1) ;Titel Auslesen
    If IsArray($sTitle) Then $sTitle = $sTitle[0] ;Anpassen
    GUICtrlSetData($hPrg2, 25)
    Sleep(500)

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

    $sID = StringRegExp($sSource, "'VIDEO_ID': '(.*?)'", 1, 1) ;ID Auslesen
    If IsArray($sID) Then $sID = $sID[0] ;Anpassen
    GUICtrlSetData($hPrg2, 50)
    Sleep(500)

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

    ;SWF ARG - Bereich auslesen
    $sSWFArgs = StringRegExp($sSource, 'SWF_ARGS(.*?)}', 1, 1)
    If IsArray($sSWFArgs) Then $sSource = $sSWFArgs[0]
    GUICtrlSetData($hPrg2, 75)
    Sleep(500)

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

    ;Code ID aus dem SWF ARG Bereich auslesen
    $sSWFID = StringRegExp($sSource, '"t": "(.*?)",', 1, 1)
    If IsArray($sSWFID) Then $sSWFID = $sSWFID[0]
    GUICtrlSetData($hPrg2, 100)
    Sleep(500)
    GUICtrlSetData($hPrg2, 0)

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

    $sDownloadLink = 'http://www.youtube.com/get_video?fmt=18&video_id=' & $sID & '&t=' & $sSWFID
    $ORISIZE = InetGetSize($sDownloadLink)
    $ihdl=InetGet($sDownloadLink, @ScriptDir & "\Videos\" & StringRegExpReplace($sTitle, "((?<!.)([a-zA-Z]\:\\)(?!\s)(([\w-+.]*" & _
    "((?<!\s)(\s{1})(?!\\)|(?<!\\)(\\{1})(?!\s))*)*)(\\?)(?!.))", "") & ".mp4", 1, 1)
    Do
    $SIZE1=InetGetInfo($ihdl, 0)
    $PROZENT = (100 * $SIZE1) / $ORISIZE
    GUICtrlSetData($hPrg1, $Prozent)
    Until $SIZE1 = $ORISIZE
    MsgBox(64, "iTube v1.0", $sTitle & " erfolgreich Heruntergeladen")
    Exit

    EndFunc ;==>_Download

    [/autoit]